advertencia: declaración implícita incompatible de la función incorporada 'xyz'


Estoy recibiendo varias de estas advertencias al compilar algunos binarios:

warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’

Para tratar de resolver esto, he añadido

#include <stdlib.h>

En la parte superior de los archivos C asociados con esta advertencia, además de compilar con las siguientes banderas:

CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc

Estoy usando GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

¿Qué debo hacer para resolver estas advertencias?

Author: Eric Leschinski, 2009-06-10

4 answers

En C, el uso de una función previamente no declarada constituye una declaración implícita de la función. En una declaración implícita, el tipo de retorno es int si recuerdo correctamente. Ahora, GCC tiene definiciones integradas para algunas funciones estándar. Si una declaración implícita no coincide con la definición incorporada, recibirá esta advertencia.

Para solucionar el problema, debe declarar las funciones antes de usarlas; normalmente lo hace incluyendo el encabezado apropiado. Recomiendo no usar las banderas -fno-builtin-* si es posible.

En lugar de stdlib.h, usted debe intentar:

#include <string.h>

Ahí es donde se definen strcpy y strncpy, al menos de acuerdo con la página man de strcpy (2).

La función exit se define en stdlib.h , sin embargo, así que no se qué está pasando allí.

 248
Author: Ville Laurikari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-17 07:12:45

En el caso de algunos programas, estos errores son normales y no deben corregirse.

Recibo estos mensajes de error al compilar el programa phrap (por ejemplo). Este programa contiene código que modifica o reemplaza algunas funciones incorporadas, y cuando incluyo los archivos de encabezado apropiados para corregir las advertencias, GCC genera un montón de errores. Así que la fijación de las advertencias rompe efectivamente la construcción.

Si tienes la fuente como parte de una distribución que debería compilar normalmente, los errores podrían ser normales. Consulte la documentación para estar seguro.

 16
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 20:48:47

Aquí hay un código C que produce el error mencionado anteriormente:

int main(int argc, char **argv) {
  exit(1);
}

Compilado así en Fedora 17 Linux de 64 bits con gcc:

el@defiant ~/foo2 $ gcc -o n n2.c                                                               
n2.c: In function ‘main’:
n2.c:2:3: warning: incompatible implicit declaration of built-in 
function ‘exit’ [enabled by default]
el@defiant ~/foo2 $ ./n 
el@defiant ~/foo2 $ 

Para que la advertencia desaparezca, agregue esta declaración al principio del archivo:

#include <stdlib.h>
 11
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-16 17:16:28

Me encontré con estas advertencias en la función mempcpy. La página man dice que esta función es una extensión de GNU y la sinopsis muestra:

#define _GNU_SOURCE
#include <string.h>

Cuando se agrega #define a mi fuente antes de #include, las declaraciones para las extensiones de GNU se hacen visibles y las advertencias desaparecen.

 6
Author: ajlittoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-28 18:06:11