string_view, возвращённый из функции
Разработчик оптимизировал разбор заголовков, чтобы не копировать строки:
std::string_view session_id(const Request& r) {
std::string id = r.header("X-Session"); // header возвращает std::string по значению
return id;
}
auto sv = session_id(req);
store(sv);
В тестах всё зелёное, но под нагрузкой в базу попадают обрывки чужих строк. Что произошло?
- `std::string_view` не хранит завершающий нуль, поэтому `store` читает за границей строки
- `string_view` возвращает вид на локальную строку, которая уничтожена при выходе из функции: `sv` указывает на освобождённую память
- Проблема в кодировке: `string_view` работает с `char`, а заголовки приходят в UTF-8, символы режутся по границе байта
- Виноват оптимизатор: в Release включается copy elision, из-за которой возвращаемое значение не копируется
