Tengo este programa en C.
#include <stdio.h>
int main() {
char foo[10];
int i;
for(i = 0; i < 20 ; i++) {
foo[i] = 0;
}
return 0;
}
Si ejecuto este script
#!/bin/bash
gcc -O3 -o hello hello.c
if [ $? -eq 0 ]
then
echo -e "\033[1;32mcompilation sucess!\033[0m"
else
echo -e "\033[1;31mcompilation error!\033[0m"
fi
saldrá
hello.c: In function ‘main’:
hello.c:8:10: warning: iteration 10u invokes undefined behavior [-Waggressive-loop-optimizations]
foo[i] = 0;
^
hello.c:6:2: note: containing loop
for(i = 0; i<20 ;i++)
^
compilation sucess!
Esto se debe a que gcc no lo consideró un error pero aun así mostró esas advertencias stderr
.
Pero todavía quiero detectar eso dentro del script bash.
Respuesta1
Creo que la respuesta de @DavidPostill es la correcta, pero si desea conservar la distinción entre advertencias y errores, además de detectar notas, puede agregar 2>err
al final del gcc
comando:
gcc -O3 -o hello hello.c
Entonces haz tu prueba:
if [ $? -eq 0 -a ! -s err ]
Respuesta2
gcc
no lo considero un error
Puedes usar el -Werror
interruptor.
-Werror
Convierta todas las advertencias en errores.
FuenteOpciones de advertencia: uso de la colección de compiladores GNU (GCC)