strncat Wformat-предупреждение о переполнении при использовании gcc 8.2.1

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

0

Решение

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

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

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

2

Другие решения

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

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

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

1

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

0
По вопросам рекламы [email protected]