LINUX.ORG.RU

Warning in gcc


0

0

Есть такой код:

#include <string.h>
#include <stdlib.h>

int main()
{
   char* str;
   strcpy(str, "1234567890");

   return (EXIT_SUCCESS);
}

~$ gcc -Wall 1.c 
# нагло молчит. 

Почему он не показал warning? Ведь память никак не выделена?
Скокмпилированный код работает как ни в чем не бывало.

П.С.:
~$ gcc --version
gcc (GCC) 3.3.1 (SuSE Linux)

П.П.С:
баян?

А разве должен показыать? splint говорит

foo.c: (in function main) foo.c:7:11: Unallocated storage str passed as out parameter to strcpy: str An rvalue is used that may not be initialized to a value on some execution path. (Use -usedef to inhibit warning)

Finished checking --- 1 code warning

stassats ★★★★
()
Ответ на: комментарий от xnix

Так это не совсем правильно: мы взяли и записали строку фиг знает куда. Или я что-то не понимаю?

П.С.: оффтоп конечно, но компилятор из visual studio пишет предупреждение

BreadFan ★★
() автор топика

Не надо ждать от компилятора слишком много, С/C++ программист в каждый
момент времени должен четко осознавать что он делает и к чему это может
привести => важен самоконтроль. В данном случае твой код корректен с
точки зрения синтаксиса и семантики, нет ни каких подозрительных
преоброзований и прочих неоднозначных конструкций, поэтому гусь и
молчит, однако в твоем коде имеет место быть логическая ошибка, которую
gcc ( будучи тупым транслятором ) увы не в состоянии распознать.

> баян?
Да

aton
()
Ответ на: комментарий от xnix

сорри :)) можно и так результат тот же:

#include <stdlib.h>

int main()
{
   char* str;
   str = "1234567890";

   return (EXIT_SUCCESS);
}

BreadFan ★★
() автор топика

Внимательно читаем документацию на gcc.

Для получения предупреждений об использовании неинициализированной
переменной надо включить -Wuninitialized. Эта опция автоматически
будет включена и при -Wall. Однако, если почитать описание для
-Wuninitialized там будет написано:

-Wuninitialized
These warnings are possible only in optimizing compilation,
because they require data flow information that is computed
only when optimizing. If you don't specify -O, you simply
won't get these warnings.

То есть компилировать надо gcc -Wall -O 1.c и тогда ты получишь
предупреждение:

1.c:6: warning: `str' might be used uninitialized in this function

Onanim
()
Ответ на: комментарий от aton

в принципе, я так и думал, но как теперь объяснить это коллегам-пользователям винды, которым VS пишет warning? :) Скажешь про [sp]lint - не поймут ведь :)

Спасибо за ответ

BreadFan ★★
() автор топика
Ответ на: комментарий от aton

2 aton :

> Не надо ждать от компилятора слишком много...

Согласен ;-)
Но эту ошибку он может найтию и находит (см мой пост выше).

Onanim
()
Ответ на: комментарий от BreadFan

> int main()
> {
>   char* str;
>   str = "1234567890";
>
>   return (EXIT_SUCCESS);
>}

Тут все хорошо

> коллегам-пользователям винды, которым VS пишет warning? 
Всегда инициализируй переменную во время объявления

aton
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.