¿Advertencia del compilador para la función definida sin prototipo en el alcance?

5 minutos de lectura

¿Advertencia del compilador para la funcion definida sin prototipo en
steve cumbre

[Question inspired by a comment thread at this answer.]

Como todos saben, desde C99 es un error llamar a una función que no ha sido declarada, preferiblemente con un prototipo adecuado.

Pero, más allá de eso, quiero que mi compilador me avise si definir una función sin una declaración de prototipo en el alcance, presumiblemente incluida fuera del mismo archivo de encabezado que usan las personas que llaman. (A menos que la función sea estática, en cuyo caso todo esto es discutible).

La razón debería ser obvia: si hay una declaración de prototipo en un encabezado, y todos los que llaman la incluyen, pero no está incluida en el archivo donde se define la función, y si la definición real de la función difiere de alguna manera del prototipo externo, entonces toda la verificación de prototipos realizada en nombre de las personas que llaman no tiene valor y, de hecho, es contraproducentemente incorrecta. Hay un error evidente, pero no se garantiza que se detecte en absoluto.

¿Existen compiladores comunes que puedan verificar esto? Probé tanto gcc como clang con -Wall, y no lo hacen. (Me imagino que la pelusa de Gimpel, si todavía está disponible, haría esto, pero no tengo una copia).

Idealmente, me gustaría que también insistiera en que el prototipo existe en un archivo de encabezado separado, pero eso es diferente, así que no insisto en eso. (La razón de esta estipulación adicional sería que algunos programadores, acosados ​​por el mensaje de advertencia hipotético, podrían intentar silenciarlo escribiendo un prototipo externo en la parte superior de la pantalla). .c archivo que contiene la definición, que, de nuevo, anularía el propósito.)

  • Para eso probablemente deberías mirar un analizador de código estático en lugar del compilador, porque no declarar un prototipo en un archivo de encabezado no es realmente un problema, siempre que haya una declaración algun lado antes de llamar a la función. La declaración podría incluso ser parte de la propia definición de la función. Incluso hay personas con estilos de código que no colocan prototipos en los archivos de encabezado, sino solo en los archivos fuente donde se llaman las funciones.

    – Un tipo programador

    17 mayo 2018 a las 22:04


  • ¿Qué quiere decir con “función global”. Supongo que “función con enlace externo”

    –MM

    17 mayo 2018 a las 22:35


  • @Someprogrammerdude Lo del archivo de encabezado separado era secundario; la preocupación principal es simplemente tener la advertencia de “definición sin prototipo”. He aclarado la pregunta. Pero tiene razón, lo que pido suena más como un analizador separado, excepto que GNU, al menos, ha declarado su oposición a los analizadores separados, ha declarado que el compilador debería hacer todo lo que un analizador separado el programa podría haberlo hecho alguna vez. (Al menos, dijeron esto una vez; no sé si sigue siendo su posición).

    – Steve cumbre

    17 mayo 2018 a las 23:00


  • @MM Sí. Pregunta aclarada.

    – Steve cumbre

    17 mayo 2018 a las 23:01

  • Hay bastantes opciones relacionadas que ayudan: -Wmissing-prototypes, -Wstrict-prototypes, -Wold-style-definitions, -Wold-style-declarationsUna de las advertencias “antiguas” no es compatible con clang (-Wold-style-declaration), y las diferentes versiones de GCC pueden admitir más o menos (los compiladores más antiguos admiten menos).

    –Jonathan Leffler

    18 de mayo de 2018 a las 4:44

1647628027 269 ¿Advertencia del compilador para la funcion definida sin prototipo en
rico

Si necesita una opción que funcione tanto en gcc como en clang, probablemente su mejor opción sea -Wmissing-prototipos. Como se indica en la documentación de gcc, esto se activará si se define una función global y:

  • No hubo declaración previa; o

  • La declaración anterior no tenía prototipo.

No se queja si la declaración anterior está contenida en el mismo archivo que la definición; es decir, no requiere que la declaración esté en un archivo de cabecera.

Esta opción debe habilitarse explícitamente; tampoco está habilitado por -Wall ni por -Wextra.

Desafortunadamente, gcc solo permite esa opción para C y Objective C; no para C++ (presumiblemente porque C++ no permite declaraciones de funciones sin prototipos). Para gcc, otra posibilidad sería -Declaraciones de Wmissing. Esta advertencia sólo se produce si no hubo declaración previa; una declaración anterior sin prototipo (es decir, int foo();) no se informa. Pero funciona tanto en C como en C++. Nuevamente, la opción de advertencia debe habilitarse explícitamente.

Clang también tiene un -Wmissing-declarations opción, pero significa algo completamente diferente y se habilita automáticamente (incluso si no hay -W opciones). Por ejemplo, esta opción controla las quejas sobre declaraciones vacías (int;), definiciones de tipos vacías (typedef int;) y compuestos sin etiquetar que no declaran ningún objeto (struct { int a; };). Gcc también emite advertencias sobre estas construcciones, pero no hay una opción obvia para habilitar o deshabilitar estas advertencias.

  • ¡Sí! Gracias. (Otro recordatorio más de que -Wall no no significa “todas las advertencias”. gr.)

    – Steve cumbre

    17 mayo 2018 a las 23:13


  • Parece ser solo gcc (clang lo acepta, pero no parece implementarlo), y tiene una ‘s’ al final (edité tu respuesta).

    – Steve cumbre

    17 mayo 2018 a las 23:14


  • @steve es extraño que no funcione con clang. Gracias por corregir el error tipográfico; Justo estaba haciendo eso cuando tu edición se realizó.

    – rico

    17 mayo 2018 a las 23:16

  • @steve: ¿-Wmissing-prototypes funciona con clang? No estoy frente a una computadora en este momento.

    – rico

    17 mayo 2018 a las 23:32

  • Sí, -Wmissing-prototypes funciona con clang, y veo que es una mejor respuesta (es lo que yo De Verdad quiere) de todos modos. Gracias por los consejos.

    – Steve cumbre

    18 de mayo de 2018 a las 3:07


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad