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

Отключить GCC "можно использовать неинициализированным" по определенной переменной

Я получаю это предупреждение в переменной стека:

warning: object.member may be used uninitialized in this function

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

В общем, я хочу получить предупреждение, только не по этой конкретной переменной в этом конкретном сценарии. Как я могу подавить предупреждение?


Похоже, что прагма-диагностика - правильный путь, но для них требуется совсем недавняя версия GCC (4.6)

Нет приемлемого решения до того, как эта версия будет известна.

4b9b3361

Ответ 1

Попробуйте сделать это:

 #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

Эта прагма представлена ​​тремя интересными и полезными ароматами: warning, error, ignored. См. 6.56.10 Диагностические прагмы для их использования. Ссылка говорит,

GCC позволяет пользователю избирательно включить или отключить определенные типы диагностики, а также изменить вид диагностика. Например, политики проекта может потребовать, чтобы все источники компилируются с помощью -Werror, но определенные файлы могут иметь исключения разрешая конкретные типы предупреждений. Или проект может выборочно включать диагностику и рассматривать их как ошибки в зависимости от того, какие макросы препроцессора определены.

Ответ 2

@Наваз ответил на вопрос, как конкретно спросил, но считаете ли вы, что тот факт, что вам это нужно, может указывать на то, что вы объявляете свой struct слишком рано/в менее вложенной области, чем это необходимо? Было бы очень желательно, если бы вы могли объявить свой struct в точке, где вы можете его инициализировать, а не объявлять его раньше и заполнять в разных местах.

Кроме того, несмотря на то, что вы можете проверить, что он никогда не использовался без инициализации прямо сейчас, что, если кто-то еще добавит новый путь кода в будущем и не инициализируется правильно? Если вы отключите предупреждение, оно будет автоматически компилироваться и, вероятно, неожиданно произойдет. Если вы не можете доказать, что инициализация занимает измеримый объем вашего программного процессора, вероятно, лучше просто выполнить инициализацию спереди.

Ответ 3

GCC различает между неинициализированным и самонактивированным, например. компилирования:

int main() {
   int i = i;
   return i;
}

С gcc -Wall -Wextra не отображается никаких предупреждений, если вы явно не добавили -Winit-self, но все же он полностью оптимизирован моим быстрым тестированием.

Ответ 4

Принятый ответ имеет две большие проблемы, которые требуют больше, чем комментарий. Во-первых, это отключает предупреждение для всего файла. Если эта прагма находится в заголовке, вероятно, для большего. Предупреждения полезны, и если это действительно ложное срабатывание, следует отключить предупреждение для набора кода как можно меньше.

Тогда предупреждение в OP "возможно неинициализировано", которое деактивируется -Wmaybe-неинициализированным, в отличие от -Wuninitialized.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
function() or int variable;
#pragma GCC diagnostic pop