2012-01-10 18 views
6

¿Hay alguna forma de hacer que gcc o clang adviertan acerca de fallas en las declaraciones de interruptores?Cómo hacer que gcc/clang advierta sobre saltos faltantes en instrucciones de cambio

Específicamente, casi siempre quiero que las declaraciones de casos finalicen con descansos, y sería fantástico si pudiera hacer que el compilador se quejara si no lo hago. Aún mejor sería si buscara una declaración de interrupción o un comentario de "// caerse".

¿Hay alguna solución diferente que las personas utilicen para ayudarse a sí mismas a no arruinar esto?

+0

posible duplicado de [¿Cómo puedo decirle a gcc que advierta (o no) en las declaraciones de cambio/caso sin interrupción?] (Http://stackoverflow.com/questions/7703358/how-can-i-tell-gcc -to-warn-or-fail-on-switch-case-statements-without-a-break) –

Respuesta

9

Con Clang tronco, utilizar -Wimplicit-fallthrough. Si está utilizando C++ 11, la transición intencional se puede marcar con una declaración [[clang::fallthrough]]; (consulte the documentation para obtener más información). La advertencia no (todavía) verifica los comentarios de "fallido". Esta característica no estará en la próxima versión 3.1 de Clang, pero estará (¡probablemente!) En 3.2.

Editar: El atributo de Clang es ahora parte de C++ 17, bajo el nombre [[fallthrough]];.

+0

Veo que acaba de marcar esta función en http://llvm.org/viewvc/llvm-project?view=rev&revision= 156086. ¡Gracias! ¡Y gracias a Alexander Kornienko! – sligocki

+1

Alexander merece todo el crédito aquí, todo lo que hice fue revisarlo. :) –

+1

C++ 17 ahora tiene el atributo [[fallthrough]]. –

2

Se preguntó que sería grande si va a buscar ya sea una sentencia break o un "// caer a través de" comentario.

¿Recuerda la primera de Henry Spencer de la Ten Commandments for C programmers?

1. Tú carrera pelusa frecuencia

Parece que lo que necesita es PC-Lint/flexelint. Aquí está advirtiendo a 616:

616 de control desemboca en caso/default - Es posible que el flujo de control para caer en una declaración de caso o una declaración por defecto de anteriormente. ¿Fue esto deliberado o el programador se olvidó de insertar una declaración de interrupción ? Si esto fue deliberado luego colocar un comentario inmediatamente antes de la declaración que fue marcado como en:

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