Kir Kolyshkin (k001) wrote,
Kir Kolyshkin
k001

Category:

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

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

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
Tags: linux, programming, work, С
Subscribe

  • two-way pipe between two processes

    Linux pipes are one-way, for a reason to avoid deadlocks I suppose. I was looking for a way to create a two-way pipe between two processes (so they…

  • debian package management

    Как-нибудь я соберусь и напишу манускрипт, полный безысходности и тлена, про пакетирование в Debian. По образу и подобию UNIX Haters Handbook.…

  • ps, top и мёртвые дети

    Помогите мне, а то я туплю уже не первый день. Хочу узнать топ самых популярных процессов в системе (по времени выполнения, включая тех самых…

Comments for this post were disabled by the author