Компилятор g cc игнорирует предупреждение неинициализированной переменной для отладочной сборки - PullRequest
0 голосов
/ 10 января 2020

gcc компилятор игнорирует uninitialized variable warning для отладочной сборки. Это выглядит очень странно для меня, может кто-нибудь помочь мне понять это?

## Program  
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int i, max;
    int count;
    if (argc < 2) {
        return -1;
    }
    max = atoi(argv[1]);
    for (i = 0; i < max; i++) {
        count++;
    }
    printf("count is %d\n", count);
    return 0;
}

g cc a. c -g -Wall -Werror

Нет предупреждения

g cc a. c -O3 -Wall -Werror

a.c: In function ‘main’:
a.c:8:9: error: ‘count’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
     int count;
         ^~~~~
cc1: all warnings being treated as errors

gcc версия: 7.4.0

1 Ответ

3 голосов
/ 10 января 2020

Хотя это может выглядеть странно, такое поведение задокументировано для -Wmaybe-uninitialized g cc опция:

-Wmaybe-uninitialized

Для автомата c (то есть локальная) переменная, если существует путь от записи функции до использования инициализируемой переменной, но существуют некоторые другие пути, для которых переменная не инициализирована, компилятор выдает предупреждение, если не может доказать, что неинициализированные пути не выполняются во время выполнения.

Эти предупреждения возможны только при оптимизации компиляции, поскольку в противном случае G CC не отслеживает состояние переменных.

Я думаю, причина в том, что стоимость анализа неинициализированных переменных слишком велика, чтобы не оптимизировать компиляцию. Вот почему это делается только для оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...