Aquí está el contenido del archivo fuente get.c:

#include <stdio.h>

int main(){
  //int i = 0;
  char b[10];
  gets(b);
  puts(b);
  return 0;
}

Cuando lo compilo con estos comandos

gcc -o get get.c -Wall -Werror

La salida es

/tmp/ccYEWZvx.o: In function `main':
get.c:(.text+0x10): warning: the `gets' function is dangerous and should not be used.

Pero cuando cambie el código a

#include <stdio.h>

int main(){
  int i = 0; // **this line just be uncommented**
  char b[10];
  gets(b);
  puts(b);
  return 0;
}

Usando el mismo comando, la salida es

cc1: warnings being treated as errors  
get.c: In function 'main':  
get.c:4: error: unused variable 'i'  

Entonces, ¿por qué esta advertencia de variable no utilizada se trata como un error, mientras que el uso de gets() no?

5
Yuan Wen 26 jun. 2017 a las 08:53

3 respuestas

La mejor respuesta

El vinculador emite la advertencia gets() por el compilador not , por lo que la configuración del compilador no se aplica.

Solo el enlazador puede determinar que el símbolo se resuelve con la biblioteca estándar gets() en lugar de alguna otra implementación con el mismo nombre.

Para indicar al vinculador que trate las advertencias como errores, debe pasar la opción --fatal-warnings. A su vez, cuando no se invoca el enlazador directamente, gcc pasa las opciones al enlazador utilizando la opción -Wl en una lista separada por comas:

gcc -o get get.c -Wall -Werror -Wl,--fatal-warnings

Tenga en cuenta que el GNU linker se documenta por separado del compilador, como parte de binutils. Las opciones del enlazador se describen aquí.

8
Clifford 26 jun. 2017 a las 06:26

-Werror realiza todas las advertencias como errores, para imprimir solo las advertencias de seguridad que puede usar: -Wformat -Wformat-security Puede leer las opciones de advertencias aquí https://gcc.gnu.org/onlinedocs/ gcc / Warning-Options.html

El compilador cancela la compilación si se produce un error, en su lugar, continúa la compilación si hay una o más advertencias.

0
gfdevelop 26 jun. 2017 a las 09:05

Si observa el resultado del primer ejemplo, dice que el "error" está en un archivo de objeto , lo que significa que es generado por el vinculador.

El compilador genera el segundo error, lo que significa que no se genera ningún archivo de objeto y, por lo tanto, no se invocará el vinculador.

2
Some programmer dude 26 jun. 2017 a las 06:01