La diferencia entre -pedantic-errors y -Werror=pedantic en gcc

6 minutos de lectura

Avatar de usuario de Supreme
supremo

¿Cuál es la diferencia entre usar -pedantic-errors y -Werror=pedantic en gcc?

Según la documentación de GCC hay una diferencia:

-pedantes-errores

Da un error cada vez que el estándar base (ver -Wpedantic) requiere un diagnóstico, en algunos casos donde hay un comportamiento indefinido en tiempo de compilación y en algunos otros casos que no impiden la compilación de programas que son válidos según el estándar. Esto no es equivalente a -Werror=pedante, ya que hay errores habilitados por esta opción y no habilitados por esta última y viceversa.

¿Qué errores están incluidos en -pedantic-errors, pero no en -Werror=pedantic?

¿Qué errores se incluyen en -Werror=pedantic, pero no en -pedantic-errors?

¿Algún ejemplo de ambos tipos de errores?

  • Creo que una diferencia es que se tratan los identificadores que comienzan con guiones bajos dobles. Si usa, digamos, __asm__ en un contexto donde el estándar requiere un diagnóstico pero por lo demás está correctamente formado (para GCC) el uso de la extensión, entonces -pedantic-errors dará un error pero -Werror=pendantic no. La otra diferencia parece ser que -Werror=pendantic da sobre violaciones estándar que no requieren diagnóstico, así que no cause errores con -pedantic-errors.

    – Ross Ridge

    22 de julio de 2015 a las 17:49

  • @JonathanWakely: ping. Esto realmente necesita una respuesta en mi humilde opinión.

    – einpoklum

    14 de diciembre de 2022 a las 17:51


Avatar de usuario de John Bollinger
Juan Bollinger

¿Cuál es la diferencia entre usar -pedantic-errors y -Werror=pedantic en gcc?

Entonces (CCG 4.9) y ahora (CCG 12.2), la diferencia es que la última opción afecta solo a los diagnósticos de la categoría “pedante”, habilitándolos y provocando que se emitan como errores, mientras que la primera hace que GCC

Emitir todas las advertencias exigidas por la estricta ISO C[]; rechazar todos los programas que usan extensiones prohibidas y algunos otros programas que no siguen ISO C

Y para

Da un error cada vez que el estándar base (ver -Wpedantic) requiere un diagnóstico, [AND] en algunos casos donde hay un comportamiento indefinido en tiempo de compilación [AND] en algunos otros casos que no impiden la compilación de programas que son válidos según el estándar.

En este contexto, es importante entender bajo qué circunstancias la norma requiere un diagnóstico, que se especifica en (C17 5.1.1.3/1):

Una implementación conforme producirá al menos un mensaje de diagnóstico […] si una unidad de traducción de preprocesamiento o una unidad de traducción contiene una violación de cualquier regla o restricción de sintaxis […]. No es necesario generar mensajes de diagnóstico en otras circunstancias.

El término “restricción” debe entenderse como cualquiera de los requisitos señalados explícitamente como tales por la especificación. Todos estos son de una naturaleza que se puede verificar en tiempo de compilación. Puede pensar en ellos como adjuntos a la sintaxis del lenguaje formal, refinando la definición de qué código es C válido. Estas son muchas menos que las reglas semánticas que especifican el significado del código C que se ajusta a la sintaxis y las restricciones. La conformidad con los requisitos de las reglas sintácticas no siempre se puede evaluar en tiempo de compilación.

Por defecto, GCC acepta algún código que no se ajusta a la sintaxis y/o restricciones de C sin emitir un diagnóstico. Con el -pedantic / -Wpedantic o -pedantic-errors en efecto, diagnostica la mayoría de las violaciones de sintaxis y restricciones relativas al dialecto seleccionado del idioma. Esto tiene la intención de proporcionar un modo en el que GCC es un procesador C conforme, pero no llega porque hay varias violaciones de restricciones que GCC no diagnostica incluso con estas opciones.

Con eso resuelto, de hecho hay algunos diagnósticos que -pedantic-errors hará que se diagnostiquen como errores, pero -Werror=pedantic no lo haré

Ejemplo:

    int y;
    uintptr_t x = &y;

GCC acepta ese código por defecto, aunque C no define el comportamiento de la asignación por no haber una conversión implícita de tipo puntero a entero. El GCC antiguo ni siquiera advierte de forma predeterminada. Cuando emite un diagnóstico, es algo como esto:

test_ped.c: In function ‘main’:
test_ped.c:6:19: warning: initialization of ‘uintptr_t’ {aka ‘long unsigned int’} from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
     uintptr_t x = &y;

Tenga en cuenta que la categoría de diagnóstico es int-conversion. No debería sorprender, entonces, que compilar con -Werror=pedantic no hace que este diagnóstico se emita como un error. Sin embargo, compilar con -pedantic-errors hace hacer que este diagnóstico se emita como un error.

Hasta donde yo sé, esto es característico de las cosas para las que -pedantic-errors emitirá errores pero -Werror=pedantic no lo haré Son todas las cosas que GCC diagnostica, cuando las diagnostica, en una categoría diferente a la de “pedante”.

Sin embargo, no he podido identificar ningún ejemplo de lo contrario: diagnósticos que solo -Werror=pedanticno -pedantic-errors, hace que se emitan como errores. Pero para la afirmación explícita del manual de que tales ejemplos existen, no esperaría encontrar ninguno, ya que los documentos parecen decir que -pedantic-errors provocará un superconjunto de los diagnósticos en el pedantic categoría a emitir, como errores. Especulo que el manual puede estar desactualizado en ese sentido, si alguna vez fue correcto en primer lugar, pero estoy preparado para sorprenderme con un ejemplo.

Una pequeña idea de por qué las dos opciones existen por separado en el capítulo 14:

Algunos conjuntos de pruebas ISO C informan fallas cuando el compilador no produce un mensaje de error para un programa determinado

ISO C requiere un mensaje de “diagnóstico” para ciertos tipos de programas no válidos, pero GCC define una advertencia para que cuente como un diagnóstico. Si GCC produce una advertencia pero no un error, ese es el soporte correcto de ISO C. Si los conjuntos de pruebas llaman a esto “falla”, deben ejecutarse con la opción GCC ‘-pedantic-errors’, que convertirá estas advertencias en errores.

Así que parece que hay algunas reglas ISO C que no están marcadas explícitamente como C inválida sino como C válida. Estas son las reglas que -pedantic-errors comete errores que -Werror=pendantic no. Tendrá que consultar el estándar ISO C para obtener más información al respecto.

En cuanto a qué errores se activan/desactivan según lo documentado por GCC, solo hay 1 que tiene -pendantic-errors explícitamente:

-Wno-implícita-función-declaración

(Solo C y Objective-C) Esta opción controla las advertencias cuando se usa una función antes de declararla. Esta advertencia está habilitada de forma predeterminada en C99 y dialectos posteriores de C, y también por -Wall. La advertencia se convierte en un error por -pedantic-errors.

Nota: sin embargo parece que no todos los autores del manual tienen la misma idea. En la sección 2 se habla de -pendantic-errors como si fuera lo mismo:

para obtener todos los diagnósticos requeridos por el estándar, también debe especificar ‘-pedantic’ (o ‘-pedantic-errors’ si desea que sean errores en lugar de advertencias).

Así que creo que ha descubierto una discrepancia editorial.

¿Ha sido útil esta solución?