2015-03-21 3 views
0
#include <string.h> 

void test(char charArray [100]) 
{ 
    strncpy(charArray, "some text", sizeof(charArray)); 
} 

int main() 
{ 
    char charArray [100]; 
    test(charArray); 
    // EDIT: According to comment from P0W I added this line - where is the difference? 
    strncpy(charArray, "some text", sizeof(charArray)); // compiles OK 
} 

Скомпилировано с gcc 4.9.2 на SLES 11 SP2 с этой командной строкой g++ gcc-warning-bug-2.cpp -Wall -Wextra -c -Werror Я получаю это предупреждение. Из-за -Werror флагом я не могу скомпилировать проект:gcc 4.9.2 ошибка в -Werror = sizeof-pointer-memaccess?

gcc-warning-bug-2.cpp: In function ‘void test(char*)’: 
gcc-warning-bug-2.cpp:5:40: error: argument to ‘sizeof’ in ‘char* strncpy(char*, const char*, size_t)’ call is the same expression as the destination; did you mean to provide an explicit length? [-Werror=sizeof-pointer-memaccess] 
    strncpy(charArray, "some text", sizeof(charArray)); 
             ^
cc1plus: all warnings being treated as errors 

Согласно фактической НКУ 4.9.2 документации https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-Wsizeof-pointer-memaccess 
Warn for suspicious length parameters to certain string and memory built-in functions if the argument uses sizeof. 
This warning warns e.g. about memset (ptr, 0, sizeof (ptr)); if ptr is not an array, but a pointer, and suggests a possible fix, or about memcpy (&foo, ptr, sizeof (&foo));. This warning is enabled by -Wall. 

это должно быть собран хорошо, потому что charArray массив!

Ошибка? Должен ли я сообщить об этом GNU gcc команде разработчиков?

+0

'' charArray'' - это указатель, массив распадается на указатель при передаче в качестве аргумента функции. 'sizeof' здесь задает размер указателя' char * ' – P0W

+0

@ P0W: см. отредактированный код. –

ответ

3

Вы попали прямо в ловушку.

В C, C++, Objective-C, Objective-C++ параметр с объявлением, который выглядит как «массив T», фактически имеет тип T *.

Ваш параметр charArray имеет объявление, которое выглядит как «массив из 100 символов», но объявление на самом деле является «указателем на символ».

Таким образом, ваш третий параметр strncpy имеет значение (скорее всего) 4 или 8, а не 100, которое вы, кажется, expecct.

BTW. strncpy очень опасен, как вы его используете.

+1

OK. Это для меня объяснение. 1) Но могу ли я это исправить? 2) Почему strncpy использует его таким образом очень опасно? Это потому, что я не считаю окончание '0x00'? –

+1

OMG. Да, я попробовал это сейчас без опции «-Wall», и он действительно копировал только 8 байтов - размер указателя в моей среде Linux! СПАСИБО! Существует действительно причина использовать переключатели '-Wall -Wextra'. Они могут сэкономить много часов на поиск ошибки! Как единственное решение, которое я вижу для меня, я должен предоставить функции с параметром 'charArray' также размер и учитывая завершение' 0x00' –

 Смежные вопросы

  • Нет связанных вопросов^_^