У меня есть следующий код, который я хочу проверить с помощью инструмента cppcheck:
void f()
{
std::string str = "123";
const char* end = &str[str.size()];
}
Но когда я запускаю cppcheck, он сообщает о следующих ошибках, которые я считаю ложными срабатываниями:
$ cppcheck oob.cpp
Checking oob.cpp ...
oob.cpp:4:27: error: Out of bounds access in 'str[str.size()]', if 'str' size is 3 and 'str.size()' is 3 [containerOutOfBounds]
const char* end = &str[str.size()];
^
oob.cpp:4:24: error: Out of bounds access of str, index 'str.size()' is out of bounds. [containerOutOfBoundsIndexExpression]
const char* end = &str[str.size()];
^
Как я понимаю, std::string
должен хранить завершающий нулевой символ вместе с остальными символами строки, поэтому str[str.size()]
должен возвращать символ 0
, но cppcheck возвращает ошибку. Это ложное срабатывание cppcheck?
std::string
возвращает указатель на внутренний буфер, нулевой терминатор уже должен быть в этом буфере. - person ks1322   schedule 15.12.2020