Алексей Иванов (alexyv) wrote,
Алексей Иванов
alexyv

Categories:
  • Mood:

Я в C++ шоке

Испытал настоящий шок, когда докопался до сути проблемы: C++ разрешает использовать черную магию 70 ступени…

Есть обычная функция, которая должна вернуть int. Внутри происходит черная магия: функция, выполняющая работу, вызывается через указатель… Выглядит это примерно так:

int getInt()
{
    return (int)WrapperCall((void *(*)(void *))DoGetInt);
}

int DoGetInt()
{
    return calcInt();
}

void DoUpdateInt()
{
    memberInt = calcInt();
}

В принципе ничего страшного :))

Чисто случайно после слияния вместо DoGetInt стала вызываться DoUpdateInt. Последняя функция ничего не возвращает, и в результате getInt возвращает неожиданные значения.

Но чему тут удивляться? Если функция ничего не возвращает, то сложно ожидать, что возвращаемое значение будет иметь какое-то разумное значение.

Вот и получается, что вместо результата вычислений в calcInt функция getInt возвращает мусор, оставшийся от работы других функций.

Если бы не отладчик, я бы еще не скоро заметил неладное…

P.S. Реальный код был несколько сложнее, было не так очевидно, что вызывается не та функция, которая должна бы.

Tags: c++, программирование, работа
Subscribe

  • Красочное небо

    Утром, выглянув в окно, я увидел это! Необычное и очень красивое небо. Красота продолжалась всего несколько минут. Солнце поднялось выше, и…

  • Дом и солнце

    Это было вчера: солнце постепенно, медленно освещало сначала дальнюю часть дома, потом двигалось ближе и ближе… Было как-то необычно красиво……

  • Снежок

    Сегодня снова шел снег. Его уже многовато :) Зато сегодня он был красивый: мягкий и пушистый. Он падал, кружился и блестел… Но общее время от…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments