URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 60202
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Как указать GCC выводить предупрежд..."

Отправлено auto_tips , 23-Окт-09 12:15 
При сборке ниже представленного некорректного кода, gcc не выдает никаких предупреждений даже с -Wall, при этом указатель он приводит к unsigned, поэтому результат сравнения всегда ложен.

   if ((fp = fopen(file, "w")) < 0)

Если написать:

   unsigned int a;
   if (a < 0)
   return 1;
   return 0;


gcc опять не ругается и даже с -O0 генерирует код, который не делает никаких сравнений, а сразу возвращает результат. То есть знает, что сравнение бессмысленное, но молчит.

Для того, чтобы gcc начал выводить предупреждения нужно указать -Wextra, тогда буде выведено:

   warning: comparison of unsigned expression < 0 is always false


URL: http://k001.livejournal.com/725123.html
Обсуждается: http://www.opennet.me/tips/info/2200.shtml


Содержание

Сообщения в этом обсуждении
"Как указать GCC выводить предупреждения для бессмысленных сравнений"
Отправлено anon , 23-Окт-09 12:15 
СТОП! А как мне заставить ГЦЦ скомпилить такое "бессмысленное сравнение" там, где это надо???

"Как указать GCC выводить предупреждения для бессмысленных ср..."
Отправлено анон , 23-Окт-09 12:19 
Иногда бывает нужно при написании антиотладки, анти-аверов и т.д.

"Как указать GCC выводить предупреждения для бессмысленных ср..."
Отправлено Аноним , 23-Окт-09 12:23 
При -fno-delete-null-pointer-checks такое сработает ?

"Как указать GCC выводить предупреждения для бессмысленных сравнений"
Отправлено pavlinux , 23-Окт-09 19:32 
Из серии - плохой компилятор знает больше, чем хороший программист.

"Как указать GCC выводить предупреждения для бессмысленных сравнений"
Отправлено Дима , 24-Окт-09 15:26 
идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется, т.к. по спецификации запрещено применять непроинициализированные локальные переменные

"Как указать GCC выводить предупреждения для бессмысленных ср..."
Отправлено Карбофос , 24-Окт-09 15:56 
прежде, чем заявлять, что "в ява сделано лучше", нужно знать, какой код генерирует gcc
кто тебе сказал, что бессмысленные выражения будут в бинарнике?

"Как указать GCC выводить предупреждения для бессмысленных ср..."
Отправлено pavlinux , 24-Окт-09 18:50 
>идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется,
>т.к. по спецификации запрещено применять непроинициализированные локальные переменные

s/непроинициализированные/не инициализированные/\g;


"Как указать GCC выводить предупреждения для бессмысленных ср..."
Отправлено Аноним , 05-Сен-15 21:43 
Алё, Дима, ты где здесь "непроинициализированные локальные переменные" увидел? Иди портфель собирай, критик юный.

"Раздел полезных советов: Как указать GCC выводить предупрежд..."
Отправлено pavlinux , 24-Окт-09 19:29 
>[оверквотинг удален]
>   return 1;
>   return 0;
>
>
>gcc опять не ругается и даже с -O0 генерирует код, который не
>делает никаких сравнений, а сразу возвращает результат. То есть знает, что
>сравнение бессмысленное, но молчит.
>
>Для того, чтобы gcc начал выводить предупреждения нужно указать -Wextra, тогда буде
>выведено:

ISO/ICE9899  стр. 44 на предмет разницы unsigned в K&R, C89 и С99

Так что

# gcc -std=c99 -W -Werror test.c

И будет вам счастье, специально для программеров на Жаве, добавляем -Werror.
За Вас, жавероф, Sun Microsystem уже подумал, тут надо самим. :)

  


"Как указать GCC выводить предупреждения для бессмысленных сравнений"
Отправлено Саша , 26-Окт-09 21:25 
как с меня прикольная заметка :)