Я использую gcc 8.2.1 и пытаюсь собрать этот код:
std::string dir = "Documents";
char * _tempname = static_cast <char*> (malloc( dir.length() + 14));
strncpy (_tempname, dir.c_str(), dir.length()+1 );
strncat (_tempname, "/hellooXXXXXX", 13);
но это дает мне это предупреждение:
предупреждение:
'char* strncat(char*, const char*, size_t)'
указанная граница
13 равно длине источника [-Wstringop-overflow =]
После поиска я обнаружил, что проблема переполнения в том, что size_t равен длине источника в соответствии с обсуждением в этом ссылка на сайт но я не мог понять, почему это считается проблемой и почему это переполняет пункт назначения. И как я могу удалить это предупреждение, не меняя мой код?
Видимо GCC понимает, что strncat(_tempname, "/hellooXXXXXX", 13);
ничем не отличается от strcat(_tempname, "/hellooXXXXXX");
и считает подозрительным, что вы используете первое вместо второго.
Если вы можете изменить код, используйте strcat
вместо этого (или даже лучше, перепишите вещь, чтобы использовать std::string
).
Если вы не можете изменить код, используйте -Wno-stringop-overflow
флаг, чтобы отключить предупреждение.
Функция ожидает, что в месте назначения осталось место, а не длина исходной строки, поэтому используйте
// ...
strncat(_tempname, "/hellooXXXXXX", dir.length() + 14 - strlen(_tempname) - 1);`
вместо. Нет, забудь об этом. использование std::string
вместо.
Насколько я понимаю, gcc выдает это предупреждение только потому, что для пользователей является обычной ошибкой устанавливать ограничение равным длине src, не более того.