¿Cómo indicar a GCC que se detenga después de 5 errores?

80

¿Es posible indicar al compilador GNU c ++ que se detenga después de que se encuentren 5 errores? No puedo encontrar esto en la documentación.

yegor256
fuente

Respuestas:

94

La opción de la línea de comandos indica al compilador que se rinda después de N errores. Esta opción está presente en GCC 4.6 y posteriores.-fmax-errors=N

La opción de la línea de comandos -Wfatal-errorsindica al compilador que se rinda después de un error. Esta opción está presente en GCC 4.0 y posteriores.

En ambos casos, las advertencias no cuentan para el límite a menos que usted también lo especifique -Werror.

zwol
fuente
5
Daría este +1 pero por la declaración sobre -Werror. Creo que las advertencias deben tratarse como si fueran errores, porque la mayoría de las advertencias son una indicación de código defectuoso.
greyfade
3
@greyfade, también creo que las advertencias generalmente deben tratarse como una solución obligada, pero desafortunadamente algunas de las advertencias de gcc pueden activarse o no dependiendo del nivel de optimización, el contenido de los encabezados del sistema y cualquier cantidad de otras cosas que no puede controlar fácilmente. . Por lo tanto, puede obtener todas las advertencias en su (s) plataforma (s) de compilación canónica, pero luego un pobre idiota intenta construir en un entorno más exótico y explota.
zwol
2
@Zack, ¿no es para eso para lo que es -Wno-system-headers?
Sam Miller
2
Los argumentos que he escuchado para no inicializar variables en las que el compilador obtiene -Wuninitializedfalsos positivos son: desperdicia I-cache en instrucciones de almacenamiento muertas pero no demostrablemente muertas; y si algo cambia y hace que la advertencia sea realmente positiva, queremos que valgrind lo detecte.
zwol
3
Desafortunadamente, el enlazador no -fmax-errorsrespeta la bandera (a partir de arm-none-eabi-gcc 5.4.1). Estaba usando la opción -finstrument-functionsy obtuve cientos de errores debido a una __cyg_profile_func_enterfunción no definida .
lorcap
45

Puede usar la opción gcc:

-fmax-errors=5

para este propósito.

user1993934
fuente
9
@Telthien ¿Por qué? Esto me parece una respuesta.
13
@Telthien stackoverflow.com/questions/how-to-answer dice "cualquier respuesta que haga que el autor de la pregunta vaya en la dirección correcta es útil" y "la brevedad es aceptable". Las respuestas están diseñadas para proporcionar una solución, que a veces se puede lograr en una sola oración.
si es útil tan breve, no hay razón para alargar la respuesta. Especialmente no por el simple hecho de ser demasiado largo o pedir-tldr.
n611x007
1
Gracias por informarme de que se ha agregado una nueva función desde que escribí mi respuesta.
zwol
5

También agradecería esa opción. Por ahora, estoy usando la siguiente solución para obtener los primeros cinco errores:

<make> 2>&1|grep error|head -5
Tomasz Romanowski
fuente
1

Tengo que preguntarte por qué querrías hacer esto. A veces, el error que existe en el código no es el primero o incluso se encuentra en los primeros cinco errores. A veces está más allá de eso y solo es reconocible una vez que se desplaza hacia abajo en la lista. Un mejor método podría ser dividir su código y colocarlo en bibliotecas más pequeñas si le molestan los tiempos de compilación. O si le preocupa que las cosas se desplacen fuera de la pantalla de una línea de comando, use el operador '>>' para canalizar los mensajes a un archivo.

Wheaties
fuente
1
Es solo una cuestión de legibilidad del registro de errores. 5 errores son más que suficientes para entender el problema, al menos en mi caso :)
yegor256
14
De Verdad? Mi experiencia ha sido todo lo contrario, especialmente en C ++, a menos que esté haciendo un tipo específico de trabajo de refactorización que cree muchos errores discretos (cambiando los argumentos a un método de uso común, por ejemplo), es probable que el primer error sea el único que tiene alguna utilidad.
zwol
@ FaZend.com Ya veo, lamento haber proporcionado una no respuesta en ese momento. La respuesta de Zack a continuación es probablemente la mejor que obtendrá a menos que vaya a escribir un pequeño script para analizar estos errores y matar el proceso después de que se generen 5 errores. (aunque podría ser bastante ignorante en esta declaración.)
wheaties
1
La gente parece tener una imaginación muy limitada sobre este tema. ¿Qué pasa con este escenario? Acaba de portar un programa a un nuevo entorno por primera vez. Obtiene un par de errores y la compilación se interrumpe. No tiene idea de cuántas incompatibilidades hay entre el entorno antiguo y el nuevo. Lo que desea saber es qué tan grave es la situación y cuántos problemas hay en su código. Le gustaría obtener todos los errores en una lista enorme para poder estimar cuánto tiempo le llevará corregirlos todos.
Phill Apley
4
@PhillApley El problema con eso es que un solo error a menudo desencadena una cascada de errores de flujo (algunos con toneladas de sugerencias de STL), por lo que si juzga por el volumen de errores y advertencias, puede sobrestimar el esfuerzo necesario y dar arriba.
Evgeni Sergeev