Archive

Posts Tagged ‘C/C++’

Список состояний конечного автомата.

May 15th, 2011 8 comments

Подсмотрел у коллеги простой и довольно удобный способ держать список состояний/событий конечного автомата в одном месте. А то обычно они норовят расползтись по разным углам: enum, объявляющий соответствующие константы, массив имен состояний для отладки, большой switch, выбирающий что делать, в зависимости от состояния…

Read more…

Вы, конечно, будете смеяться, …

May 4th, 2011 5 comments

… но я понятия не имел, что вложенные структуры в C/C++ можно инициализировать плоским списком значений. Есть, например, вот такая структура:

struct foo {
    int value;
};

struct bar {
    int value;
};

struct foobar {
    foo value1;
    bar value2;
    int value3;
};

Её можно инициализировать вот так:

foobar data = { { 1 }, { 2 }, 3 };

А можно и так:

foobar data = { 1, 2, 3 };

Компилятор съест оба варианта кода и не поморщится.

PS. Ну а чё, – эксперт в C, больше десятка лет в индустрии, то-сё. :-)

Tags:

Деманглинг имен в Visual C++.

November 11th, 2009 4 comments

На днях пытался понять, отчего и почему крошечное приложение пухнет как на дрожжах при добавлении некоторых библиотек из Boost. Рассматривая сгенерированный map файл, выяснил, что утилита undname.exe поставляется вместе с Visual Studio и в состав Windows SDK не входит. Пришлось написать свою – там всего-то нужно вызвать одну функцию (UnDecorateSymbolName). По ходу дела нашел несколько интересных ссылок по теме:

  • Схема, по которой кодируются имена:
  • Tips: Visual C++ – упоминает, что UnDecorateSymbolName не умеет декодировать имена классов. Вместо неё предлагается использовать недокументированную функцию, предоставляемую самим компилятором – _unDName. Вот аналогичная жалоба на rsdn.ru.
  • Исходный код _unDName из проекта Wine

Разница между UnDecorateSymbolName и _unDName меня совсем не удивляет. Эти функции происходят из двух разных проектов. UnDecorateSymbolName (dbghelp.dll) – это реализация из WinDbg (Windows Division). _unDName (msvcrt.dll) пишут разработчики компилятора (DevDiv). К счастью, новые версии WinDbg выходят гораздо чаще, чем новые версии Visual C++. Есть шанс, что найденные ошибки будет оперативно подправлены. :-)

Возвращаясь к теме про фаззеры.

January 31st, 2008 6 comments

Вот код, которым я пользуюсь для написания стресс тестов и фаззеров в своих проектах. Класс EntropyGenerator – обертка вокруг генератора случайных чисел.

Read more…

SAL аннотации.

October 31st, 2007 4 comments

В последнее время я немного забросил Win32.Utf8 – на работе завал, так что, приходя домой, делать ничего особенного не хочется. Тем не менее, проект потихоньку движется и, на сегодняшний день, я добрался до разбора SAL аннотаций.

Read more…

Tags: , ,

Boost переехал в Subversion репозиторий.

August 28th, 2007 2 comments

Я как-то упустил из виду. Похоже, что Boost наконец-то переехал в Subversion репозиторий, а баги теперь ведутся в Trac. Давно пора.

Tags: ,

sizeof(void) == 1

August 20th, 2007 11 comments

Наткнулся на забавную вещь. Вот такой код спокойно компилируется GCC (версия 3.4.2 (mingw-special)):

#include <stdio.h>

int main()
{
    void* ptr;

    printf("sizeof(void): %d\\n", sizeof(void));

    ptr = 0;
    printf("before increment: %p\\n", ptr);
    ptr += 1;
    printf("after increment: %p\\n", ptr);

    return 0;
}

Read more…