Итак, приведённый ниже код сделал для меня GigaChat. Интересно, кстати, что пока он схалтурил: решил не делать настоящую конвертацию кода. Но при этом сам момент, что надо обрабатывать UTF-8, уже приводит к возникновению некорректного C++ кода.
....
// Вспомогательная функция для преобразования
// char-вектора в utf-8 строку
std::string to_utf8(const std::vector<char>& data)
{
// Для простоты считаем, что вектор представлен в UTF-8 изначально
return { data.begin(), data.end() };
}
....
// Главная функция для разделения строки на токены
std::vector<std::string_view>
tokenize_string_giga(const std::vector<char>& input_data)
{
std::string text = to_utf8(input_data);
std::vector<std::string_view> result;
size_t pos = 0;
while (pos < text.size())
{
if (is_letter(text[pos]) || is_digit(text[pos]))
{
size_t begin_pos = pos++;
// ищем конец текущего набора алфавитно-цифровых символов
while (pos < text.size() &&
(is_letter(text[pos]) || is_digit(text[pos])))
++pos;
// Извлекаем полное слово
std::string_view current_word =
text.substr(begin_pos, pos - begin_pos);
// Дробим слово на отдельные токены
split_word_into_tokens(current_word, result);
}
else
{
++pos; // пропускаем неалфавитно-цифровые символы
}
}
return result;
}
Ошибка связана со временем жизни объекта. Обратите внимание на фрагмент, где извлекаются слова:
std::string_view current_word = text.substr(begin_pos, pos - begin_pos);
Функция
substr создаёт временный объект типа std::string, который затем разрушается. В результате в current_word сохраняются указатели на уже разрушенный объект.Естественно, я попробовал запустить PVS-Studio. Он выявляет эту ошибку следующим предупреждением: V1017 [CWE-416] Variable of the 'string_view' type references a temporary object which will be removed after evaluation of an expression. Tokenizer_giga.cpp 79
Что интересно, приблизительно на том же споткнулся и DeepSeek. Он сгенерировал больше кода, так как не поленился повозиться с UTF-8, поэтому приведу здесь сразу выжимку:
std::vector<std::string_view>
tokenize_string(const std::vector<char>& buffer)
{
std::vector<std::string_view> tokens;
....
std::string utf8_text = detect_and_convert_to_utf8(buffer);
....
std::string_view token(utf8_text.data() + token_start, pos - token_start);
....
tokens.push_back(token);
....
return tokens;
}
В функции создаётся локальная переменная
utf8_text типа std::string. Её разбивают на токены и записывают указатели на них в выходной массив tokens. Естественно, после выхода из функции переменная utf8_text уничтожается и ссылки становятся невалидными. К сожалению, здесь PVS-Studio пока помочь не смог: у него не получилось сопоставить время жизни utf8_text и tokens.