При сборке ниже представленного некорректного кода, 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
Обсуждается: https://www.opennet.ru/tips/info/2200.shtml