July 5th, 2011

nepal

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

Нашёл нынче совершенно случайно багу в нашем коммерческом продукте. Офигел слегка.

Бага заключается в следующем: утилита, если ей задать один параметр и не задать другой (второй к первому обязателен, а я не знал) ругается (что параметра нет) и внезапно молча удаляет конфигурационный файл. После чего все эта утилита работать не хочет, потому что конфигурационного файла нет, а значит, ничего нет. Я как-то не сразу понял, в чём дело, но потом разобрался, как именно это воспроизвести и даже почему это так происходит (для коллег -- PCLIN-29569).

Collapse ) На закуску любителям языка Си -- угадайте, что напечатает этот код (ну или так -- что он может напечатать, согласно стандарту и на практике):
#include <stdio.h>

void a(void) {
        char str[32];
        sprintf(str, "My father was a sailor");
}

void b(void) {
        char str[16];
        puts(str);
}

int main(void) {
        a(); b();
        return 0;
}
Ответ чёрным по чёрному (выделите мышкой, чтобы увидеть):
Всё что угодно может напечатать; у меня с gcc-4.5.1 -O0 он печатает слово sailor :)
nepal

vim + cscope quick howto & tips

Если вы не программируете на Си и не используете для этого vim, дальше можно не читать.

Если вы пользуетесь тегами (ctags) в vim, то вы, конечно, знаете, что с их помощью можно по Ctrl-] прыгать с места, где вызывается функция, на место, где она определена (и по Ctrl-T прыгать обратно). Это удобно и здорово, и не только для функций работает, но и, скажем, для структур.

Иногда, однако, хочется прыгать в другую сторону -- в место (места), где эта функция используется (вызывается). Для этого ctags не подходит, а подходит cscope. vim тоже умеет интегрироваться с cscope, но есть нюансы.

Например, не нашлось комбинации клавиш для "прыганья", и читать базу cscope (файлик cscope.out) при настройках по умолчанию (vim-7.3, Fedora 14) vim хочет только из текущего каталога (а хочется ещё и из каталога этажом выше, или двумя этажами выше). Что касается комбинации клавиш, я не придумал ничего лучше, как использовать соседнюю с Ctrl-], а именно Ctrl-\. Они рядом, в этом есть логика. Обратно прыгаем точно так же, как и с тегами, по Ctrl-T.

Решить обе вышеописанные проблемы получилось вот таким кусочком заклинаний для ~/.vimrc:

" CScope
if has("cscope")
        " Ctrl-\ does reverse search (i.e. "who calls this function")
        nmap  :cscope find c <c-r>=expand("<cword>")<cr><cr>

        set nocsverb
        if filereadable("../cscope.out")
                cs add ../cscope.out ..
        elseif filereadable("../../cscope.out")
                cs add ../../cscope.out ../..
        endif
        set csverb
endif


Что ещё? Базу для cscope можно сгенерить командой cscope -R -b, находясь в корне исходников проекта. В общем, больше ничего и не надо.