gcc 4.8 дайте мне ошибку при построении
#include <string.h>
#include <stdio.h>
static inline void toto(char str[3])
{
snprintf(str, sizeof(str), "XX");
}
int main(){
char str[3];
toto(str);
return 0;
}
Вот ошибка gcc
ошибка: аргумент для вызова 'sizeof in' snprintf - это то же выражение, что и пункт назначения; Вы имели в виду предоставить ясную длину?
Примечание. Я использую флаги -Wall -Werror, которые преобразуют предупреждение в ошибку.
Здесь что-то похожее В комментарии кто-то ответил на это
"Для буферов с фиксированной длиной я обычно использую strncpy (dest, src, sizeof (dest)); dest [sizeof (dest) -1] = '\ 0'; Это гарантирует завершение NULL и это всего лишь меньше хлопот, чем snprintf не говоря уже о том, что многие люди используют snprintf (dest, sizeof (dest), src) и вместо этого очень удивляются, когда их программы сбой произвольно".
Но это неправильно: gcc 4.8 сказать
"error: аргумент для 'sizeof in' вызов strncpy - это то же выражение, что и пункт назначения, вы имели в виду предоставить явную длину? [-Werror = sizeof-pointer-memaccess]" /p >
в документации gcc 4.8, они говорят об этой проблеме: они говорят:
Поведение -Wall изменилось и теперь включает новый флаг предупреждения -Wsizeof-pointer-memaccess. Это может привести к появлению новых предупреждений в коде, которые были скомпилированы с использованием предыдущих версий GCC.
Например,
include string.h
struct A { };
int main(void)
{
A obj;
A* p1 = &obj;
A p2[10];
memset(p1, 0, sizeof(p1)); // error
memset(p1, 0, sizeof(*p1)); // ok, dereferenced
memset(p2, 0, sizeof(p2)); // ok, array
return 0;
}
Дает следующую диагностику: warning: аргумент "sizeof in" void memset (void *, int, size_t) - это то же выражение, что и пункт назначения; Вы имели в виду разыгрывать это? [-Wsizeof-указатель memaccess] memset (p1, 0, sizeof (p1));//ошибка ^ Хотя эти предупреждения не приведут к сбою компиляции, часто -Wall используется в сочетании с -Werror, и в результате новые предупреждения превращаются в новые ошибки. Чтобы исправить, либо перепишите для использования memcpy, либо разыщите последний аргумент в нарушающем вызове memset. *
Ну, в их примере, очевидно, что код был неправильным, но в моем случае, с snprintf/strncpy, я не понимаю, почему, и я думаю, что это ложная ошибка positif gcc. Правильно?
спасибо за помощь