Подтвердить что ты не робот

GCC -Униминизированные/-Weaybe-uninitialized вопросы

Я испытываю очень странную проблему, используя gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2. Я не могу скомпилировать следующий действующий код без предупреждения:

extern void dostuff(void);

int test(int arg1, int arg2)
{
    int ret;

    if (arg1) ret = arg2 ? 1 : 2;

    dostuff();

    if (arg1) return ret;

    return 0;
}

Параметры компиляции и вывод:

$ gcc-4.7 -o test.o -c -Os test.c -Wall
test.c: In function ‘test’:
test.c:5:6: warning: ‘ret’ may be used uninitialized in this function [-Wmaybe-uninitialized]

Однако следующий код компилируется без предупреждения (хотя и чуть менее эффективной сборки):

extern void dostuff(void);

int test(int arg1, int arg2)
{
    int ret;

    if (arg1 && arg2) ret = 1;
    if (arg1 && !arg2) ret = 2;

    dostuff();

    if (arg1) return ret;

    return 0;
}

Я немного застрял и рассматриваю эту ошибку компилятора. Любые мысли?

4b9b3361

Ответ 1

Действительно, это известная проблема в gcc.
gcc печально известен как неверные неинициализированные переменные.
Недостатки были отмечены должным образом, и есть инициатива по преодолению недостатков:
Лучше неинициализированные предупреждения:

Сборник компиляторов GNU предупреждает об использовании неинициализированных переменных с опцией -Wuninitialized. Однако в нынешней реализации есть некоторые предполагаемые недостатки. С одной стороны, некоторые пользователи хотели бы получить более подробные и последовательные предупреждения. С другой стороны, некоторые пользователи хотели бы получить как можно меньше предупреждений. Цель этого проекта - реализовать обе возможности и в то же время улучшить существующие возможности.

Инициатива направлена ​​на предоставление более эффективных предупреждений, и она приводит пример примера, подобный вашему делу. Соответствующей частью является:

То, что пользователь понимает как ложный, может отличаться для конкретного пользователя. Некоторые пользователи заинтересованы в случаях, которые скрыты из-за действий оптимизаторов в сочетании с текущей средой. Однако многих пользователей нет, поскольку этот случай скрыт, потому что он не может возникнуть в скомпилированном коде. Канонический пример

int x;
if (f ())
     x = 3;
return x;

где 'f' всегда возвращает ненулевое значение для текущей среды и, следовательно, может быть оптимизировано. Здесь группа пользователей хотела бы получить неинициализированное предупреждение, так как "f" может возвращать ноль при компиляции в другом месте. Тем не менее, другая группа пользователей рассмотрит ложное предупреждение о ситуации, которая не может возникнуть в компиляции исполняемого файла.