Есть ли способ заставить gcc или clang предупредить о пропущенном 'else'? - PullRequest
3 голосов
/ 24 января 2012

Я бы хотел, чтобы компилятор предупреждал меня, если я не обрабатываю каждое , если условие else оператора. Это существует в clang или gcc ?

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

Представьте, что это автоматический анализ кода или инструмент статического анализа.

Сказать, что компилятор не может этого сделать, потому что это законно, ... на практике не проблема. Каждый компилятор C / C ++, который я когда-либо видел, с удовольствием выдает множество предупреждений в отношении кода, который совершенно синтаксически и семантически допустим. (Например, в gcc, -Wunused-value, -Wunused-label, -Wunreachable-code и т. Д ...)

Ответы [ 3 ]

8 голосов
/ 24 января 2012

Если вы действительно хотите этого, я мог бы предложить загрузить Cppcheck и добавить проверку для этого. Cppcheck выполняет простые виды сопоставления на основе текста для проверки набора правил. Было бы достаточно просто предупредить об отсутствующем предложении else.

Я реализовал проверку прототипа для «пропавших без вести» в ветке missing-else здесь: https://github.com/ghewgill/cppcheck/tree/missing-else. Это проходит свой собственный тест, но не проходит много других тестов из-за нового неожиданного предупреждения о стиле (в противном случае допустимо) код).

3 голосов
/ 24 января 2012

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

0 голосов
/ 24 января 2012

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

#define IF
#define THEN ?
#define ELSE :    

Тогда вы просто напишите свой код так:

int foo(bool flag)
{
    return IF(flag) THEN 0 ELSE -1;
}

Конечно, это плохая идея.

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