Как только сел за комп, сразу начал с чтения почты. В source-changes@ кто-то удивлялся найденному в ядре OpenBSD коду (см. письмо и патч :)), который выглядел примерно так:
if((var < 0) && (var > 2)) {...}Я ещё подумал, «Ну и ошибка! Надо же какая глупая, ведь тут всё так понятно, что такой ситуации никогда не будет, такое в книжках для чайников описывают даже...» Тот, кто нашел, разумеется, заменил логическое И на логическое ИЛИ, а я полез в код :-)
Сегодня я полдня копался во внутренностях программы wmdiskmon. Вооружился splint'ом и правил/фиксил/разбирался. wmdiskmon выбрал потому, что проект маленький (всего 3 файла, один из который заголовочный и там только прототипы) и потому, что Томас весьма своевременно мне отвечает на письма, что не маловажно :)
Сначала, я решил пройтись по коду компилятором с флагом -W (aka -Wextra). И тут же наткнулся на такое же, вечное ложное, условие как и в BSD:
static void draw_digits(unsigned num) {
unsigned v100, v10, v1;
int y = 0;
if (num < 0) num = 0;
...
gcc пожаловался мне на него так:
main.c: In function `draw_digits':
main.c:411: warning: comparison of unsigned expression < 0 is always false
splint, к слову, такие условия тоже ловит:
tmp/wmdiskmon-0.0.1.orig/src/main.c:411:9:
Comparison of unsigned value involving zero: num < 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)
Также наткнулся на одну забавность:
static void print_help(char *prog)
{
printf("Usage : %s [OPTIONS]\n", prog);
printf("wmmaiload - Window Maker mails monitor dockapp\n"
...
Самая ироня в том, что это в коде программы wmDiskMon :))))) гггг
Там же в комментах:
* WMMDiskLoad - A dockapp to monitor disks usage
* Copyright (C) 2002 Mark Staggs <me at markstaggs.net>
*
* Based on work by Seiichi SATO <ssato at sh.rim.or.jp>
* Copyright (C) 2001,2002 Seiichi SATO <ssato at sh.rim.or.jp>
Вообщем, автор, как видим, позаимствовал код из нескольких подобных проектов, но забыл удалить даже назания тех программ из usage. Ну что ж бывает. Для себя понял, что брать чужой код не стОит вообще, потому что с этим много проблем обычно. Кстати, пока не забыл демострирую:
[c0der@mycomp ~]$ wmdiskmon -h H -3
Usage : wmdiskmon [OPTIONS]
wmmaiload - Window Maker mails monitor dockapp
-d, --display display to use
:)))))) В новой сборке wmdiskmon такого безобразия, разумеется, не будет. Вообще, есть идея вылизать эту утилитку splint'ом да потом ещё и valgrind'ом по ней пройтись и всю такую красивую отправить в Сизиф, ну и патчи автору :) Не знаю смогу ли осуществить всё задуманное и хватит ли знаний/опыта/etc
И это, кстати, только то, что я нашел ковыряясь в файле main.c, что же до файла dockapp.c, то там splint детектит кучу утечек памят (memory leaks) Надо вот разобраться только как их фиксить, и в бой!
<OFF>
Сижу в комнате, в двух кофтах и в двух носках — ноги замерзли. На улице не был, но говорят, что там ниже -35 Вот, так вот живут программисты в Сибири! ;))))
</OFF>
P.S. Надо бы мне книжку по Си почитать. Что-то он мне нравится стал :)