k001
k001
:...
k001 [userpic]
О, сколько нам открытий чудных...

Нашёл сегодня в одной, не буду упоминать тут, какой именно, программе следующий код:

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


Удивился, конечно. Видимо, раньше было написано open, или ещё почему. Исправил, конечно. Но не в этом суть.

Более всего удивился тому, что gcc не ругается даже с -Wall. Выяснил, что указатель он приводит к unsigned, поэтому результат сравнения всегда ложен.

Попробовали с коллегой написать так:

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


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

Оказалось, надо ему сказать -Wextra, и уж тогда начинает ругаться. Для второго случая вот так:
warning: comparison of unsigned expression < 0 is always false

Comments

А где же тэги «wtf» и «killallhumans»?

Старый добрый lint не подводит

flamingo@~(501)>lint foo/lint.c
"lint.c", line 4: warning: degenerate unsigned comparison
"lint.c", line 2: warning: function foo defined but never used
flamingo@~(502)>cat foo/lint.c
int foo()
{
unsigned a = 1;
if (a < 0) {
return 0;
}
return 1;
}

Re: Старый добрый lint не подводит

Я тут попробовал каким-то новомодным cppcheck — тоже, собака, молчит.

Re: Старый добрый lint не подводит

А линта, блин, в Федоре вообще нету что-то…

Да, на Линухе он называется splint:

cheetah@/site/home/iusvyatsky/linux/master-tree(551)>splint ~/foo/lint.c
Splint 3.1.2 --- 26 Feb 2009

foo/lint.c: (in function foo)
foo/lint.c:4:6: Comparison of unsigned value involving zero: a < 0
An unsigned value is used in a comparison with zero in a way that is either a
bug or confusing. (Use -unsignedcompare to inhibit warning)

Finished checking --- 1 code warning

гмм

по моему, все и так знают что -Wall не включает -W, и что без -W -Wall -Werror компиляются только полные долбоебы?

Ну разве он не душка, этот gcc? :)

unsigned

Дятлы Вы

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

Так что

# gcc -std=c99 -W

И будет вам счастье.