Сегодня 4 декабря, среда ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7276
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Kir Kolyshkin
Kir Kolyshkin
Голосов: 1
Адрес блога: http://k001.livejournal.com/
Добавлен: 2008-02-19 12:45:30 блограйдером Lurk
 

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

2011-07-05 01:33:09 (читать в оригинале)

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

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

Код примерно вот такой:

int SomeFunction(int id, int cmd)
...
        char dumpfile[4096];
...
        if (gparam->dumpfile == NULL) {
                if (cmd == CMD_DUMP) {
                        logger(-1, 0, "Dump file is not specified.");
                        goto child_err;
                }
...
// где-то тут мы заносим имя файла в dumpfile, но до этого места мы не доходим.
...
child_err:
        if (cmd == CMD_CHKPNT || cmd == CMD_DUMP)
                unlink(gparam->dumpfile ? : dumpfile);

Похоже, что dumpfile выделяется на стеке, и в этом же самом месте памяти раньше лежало имя файла, который мы и удаляем. И компилятор, конечно, не может поругаться на неинициализированную переменную -- мало ли куда какой поинтер передают...

На закуску любителям языка Си -- угадайте, что напечатает этот код (ну или так -- что он может напечатать, согласно стандарту и на практике):
#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 :)

Тэги: programming, work, wtf

 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по количеству голосов (152) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.