При сборке ниже представленного некорректного кода, 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
СТОП! А как мне заставить ГЦЦ скомпилить такое "бессмысленное сравнение" там, где это надо???
Иногда бывает нужно при написании антиотладки, анти-аверов и т.д.
При -fno-delete-null-pointer-checks такое сработает ?
Из серии - плохой компилятор знает больше, чем хороший программист.
идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется, т.к. по спецификации запрещено применять непроинициализированные локальные переменные
прежде, чем заявлять, что "в ява сделано лучше", нужно знать, какой код генерирует gcc
кто тебе сказал, что бессмысленные выражения будут в бинарнике?
>идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется,
>т.к. по спецификации запрещено применять непроинициализированные локальные переменныеs/непроинициализированные/не инициализированные/\g;
Алё, Дима, ты где здесь "непроинициализированные локальные переменные" увидел? Иди портфель собирай, критик юный.
>[оверквотинг удален]
> 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 уже подумал, тут надо самим. :)
как с меня прикольная заметка :)