вторник, 23 марта 2010 г.

Сколько яблок у Маши?

Вопрос: У Миши было 5 яблок.
Два яблока он отдал Маше.
Сколько стало у Маши?
Ответ: Неизвестно. Нужно
инициализировать переменные.

Сегодня столкнулся с тем, что в релизе программа не работала, а в дебаге выполнялась вполне корректно. Причины могут быть разными, но первое что нужно проверять — это все ли переменные инициализированы. Интересно, что в Visual Studio нет никакого предупреждения с /W4 и флагом /analyze. В приведенном ниже примере компилятор нашел только одну проблему:
#include <iostream>
using namespace std;

struct  X
{
    int x;
};

struct Y
{
    int y;

    Y() {}
};

int main()
{
    X x;
    Y y;
    int ly = y.y; // не ловит
    int lx = x.x; // warning C6001: Using uninitialized memory 'x': Lines: 19, 20, 21, 22
    cout << ly << endl << lx << endl;
}
Из других компиляторов, которые я попробовал ошибку поймал только GNU C++ с флагом -Wuninitialized. Comeau С++ и Intel C++ поймали только одну ошибку. А мне казалось, что такие простые вещи уже научились ловить все приличные компиляторы...

Комментировать в ВКонтакте