strncat Предупреждение о переполнении формата при использовании gcc 8.2.1 - PullRequest
0 голосов
/ 21 ноября 2018

Я использую 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 равна длине источника в соответствии с обсуждением в этой ссылке но я не мог понять, почему это считается проблемой и почему это переполняет пункт назначения.И как я могу удалить это предупреждение, не меняя мой код?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Очевидно, что GCC понимает, что strncat(_tempname, "/hellooXXXXXX", 13); ничем не отличается от strcat(_tempname, "/hellooXXXXXX");, и считает подозрительным, что вы используете первый вместо второго.

Если вы можете изменить код, используйте strcatвместо этого (или даже лучше, перепишите вещь, чтобы использовать std::string).

Если вы не можете изменить код, используйте флаг -Wno-stringop-overflow, чтобы отключить предупреждение.

0 голосов
/ 21 ноября 2018

Насколько я понимаю, gcc выдает это предупреждение только потому, что для пользователей является обычной ошибкой устанавливать ограничение равным длине src, не более того.

0 голосов
/ 21 ноября 2018

Функция ожидает, что в месте назначения осталось место, а не длина исходной строки, поэтому вместо нее используйте

// ...
strncat(_tempname, "/hellooXXXXXX", dir.length() + 14 - strlen(_tempname) - 1);` 

.Нет, забудь об этом.Вместо этого используйте std::string.

...