Как заставить gcc / clang предупреждать о пропущенных перерывах в выражениях switch - PullRequest
7 голосов
/ 10 января 2012

Есть ли способ заставить gcc или clang предупреждать о пропущенных перерывах в операторах switch?

В частности, я почти всегда хочу, чтобы операторы case заканчивались прерываниями, и было бы здорово, если бы я мог заставить компилятор жаловаться, если я этого не сделаю. Еще лучше было бы, если бы он искал либо оператор break, либо комментарий «// провалиться».

Есть ли другое решение, которое люди используют, чтобы помочь себе не облажаться?

Ответы [ 3 ]

10 голосов
/ 06 мая 2012

С Clang trunk, используйте -Wimplicit-fallthrough. Если вы используете C ++ 11, преднамеренное падение может быть помечено оператором [[clang::fallthrough]]; (дополнительную информацию см. В документации для этого атрибута). Предупреждение (пока) не проверяет «проваливаются» комментарии. Эта функция не будет в следующей версии 3.1 Clang, но (вероятно!) Будет в 3.2.

Редактировать: Атрибут Clang теперь является частью C ++ 17 под именем [[fallthrough]];.

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

Насколько я понимаю, это все еще не назначенный запрос функции в gcc.

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652

2 голосов
/ 11 января 2012

Вы спросили, что было бы замечательно, если бы он искал либо оператор прерывания, либо комментарий "// провалиться".

Вспомните первую Генри Спенсера из Десять заповедей дляПрограммисты C ?

1.Ты будешь часто бегать с ворсом

Похоже, тебе нужен PC-Lint / flexelint.Вот предупреждение 616:

616 управление переходит в case / default - Поток управления может попасть в оператор case или оператор по умолчанию сверху.Было ли это преднамеренным или программист забыл вставить оператор прерывания?Если это было преднамеренно, поместите комментарий непосредственно перед заявлением, помеченным как:

case 'a': a = 0;
   /* fall through */
case 'b': a++;
...