October 16th, 2009

nepal

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

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

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