Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Thelord en 1 Octubre 2010, 18:28 pm



Título: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Thelord en 1 Octubre 2010, 18:28 pm
Hola, buen día a todos.

Intento compilar Ettercap 0.7.3 pero al final me muestra el siguiente error:

Código:
cc1: warnings being treated as errors
ec_linux.c: In function ‘disable_ip_forward’:
ec_linux.c:44: error: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result
ec_linux.c: In function ‘restore_ip_forward’:
ec_linux.c:71: error: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result


^Tifa^ comenta que _warn_unused_return solicita que las 2 funciones devuelvan algún valor, pero son funciones void. Aquí esta el post donde hace mención:
Su error es referente a 2 funciones declaradas con el atributo _warn_unused_return_  que aparentemente no estan devolviendo nada para ser funciones, y por ende el atributo esta lanzando un aviso de que no estan estas 2 funciones devolviendo nada..... como este atributo deberia tratarse solo como warnings y continuar con la compilacion pero esta simpatica linea :

cc1: warnings being treated as errors

Ya especifica que si hay warnings.. pues tratalos como error, y tratarlos como error es No compilar.

Abre el archivo linux.c especificamente dentro de estas 2 funciones :

disable_ip_forward()
restore_ip_forward()

Que estan cerca de la linea 44 y 71 como te indica ahi...

Puedes postear el codigo de ambas?  Te recomiendo que los postees en el subforo de programacion de C/C++ ya que aqui podran ayudarte mas que en este subforo de Linux. Ya que tu problema no es de configuracion o Linux en si, sino de una aplicacion que no compila porque su apreciado codigo tiene atributos incluidos (Fuera mas facil quitarlos todos de los archivos cabeceras y que el compilador No chequee nada y compile, pero esto es falta de etica para un programador  ;D )

En fin como te dije abre las 2 funciones anteriores, copia el codigo de estas en el foro de C/C++ y expon tu error que no puedes compilar por x atributos declarados, y que no quieres quitar los atributos (Que es probable que te den esa solucion que es la mas facil) sino que tu quieres que estas funciones obligatoriamente retornen un valor   ;)


Esto en el archivo: ec_linux.c , les marco la línea 44  ;)
Código:
void disable_ip_forward(void)
{
   FILE *fd;
  
   fd = fopen("/proc/sys/net/ipv4/ip_forward", "r");
   ON_ERROR(fd, NULL, "failed to open /proc/sys/net/ipv4/ip_forward");

/*Esta es la línea 44 jeje */   fscanf(fd, "%c", &saved_status);
   fclose(fd);

   DEBUG_MSG("disable_ip_forward: old value = %c", saved_status);
 
   fd = fopen("/proc/sys/net/ipv4/ip_forward", "w");
   ON_ERROR(fd, NULL, "failed to open /proc/sys/net/ipv4/ip_forward");
  
   fprintf(fd, "0");
   fclose(fd);
  
   atexit(restore_ip_forward);
}

static void restore_ip_forward(void)
{
   FILE *fd;
   char current_status;
  
   /* no modification needed */
   if (saved_status == '0')
      return;
  
   /* read the current status to know if we need to modify it */
   fd = fopen("/proc/sys/net/ipv4/ip_forward", "r");
   ON_ERROR(fd, NULL, "failed to open /proc/sys/net/ipv4/ip_forward");

   fscanf(fd, "%c", &current_status);
   fclose(fd);
  
   DEBUG_MSG("ATEXIT: restore_ip_forward: curr: %c saved: %c", current_status, saved_status);

   if (current_status == saved_status) {
      DEBUG_MSG("ATEXIT: restore_ip_forward: does not need restoration");
      return;
   }
  
   fd = fopen("/proc/sys/net/ipv4/ip_forward", "w");
   if (fd == NULL) {
      FATAL_ERROR("ip_forwarding was disabled, but we cannot re-enable it now.\n"
                  "remember to re-enable it manually\n");
   }

   fprintf(fd, "%c", saved_status);
   fclose(fd);

   DEBUG_MSG("ATEXIT: restore_ip_forward: restore to %c", saved_status);
}

Al parecer ^Tifa^ tiene muy claro el problema, el detalle es que no se como solucionarlo y siento que ya le invertí mucho tiempo a la instalación de Ettercap (mas de 5 horas) que no quisiera ver perdido ese tiempo  ;D Ayuda, please.

Gracias y un saludo.



Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Eternal Idol en 2 Octubre 2010, 11:48 am
Yo imagino que se podra compilar deshabilitando ESE warning o TODOS los warnings, sino no entiendo que ese codigo este disponible. Asi que en realidad no deberias tocar el codigo sino la forma de generarlo (makefile o lo que sea).

Si queres cambiar el codigo declara una variable de tipo int al principio de ambas funciones y asignale el resultado de la funcion fscanf.

Ej. para la primera:

Código
  1. void disable_ip_forward(void)
  2. {
  3.   FILE *fd;
  4.   int ir; //items read
  5.  
  6.   fd = fopen("/proc/sys/net/ipv4/ip_forward", "r");
  7.   ON_ERROR(fd, NULL, "failed to open /proc/sys/net/ipv4/ip_forward");
  8.  
  9.   ir = fscanf(fd, "%c", &saved_status);
  10. ...
  11.  

PD. Encima es C ...


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Thelord en 2 Octubre 2010, 23:59 pm
Gracias.

Listo, se salta ese error. Ahora lo que marca es lo siguiente:

Código:
cc1: warnings being treated as errors
ec_text.c: In function ‘text_input’:
ec_text.c:186: error: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
ec_text.c: In function ‘text_run_plugin’:
ec_text.c:441: error: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
ec_text.c: In function ‘text_visualization’:
ec_text.c:561: error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

Al parecer es el mismo detalle, así que intente hacer lo mismo en el archivo correspondiente, pero me resulto el siguiente error(Solo cambie la línea 186):

Código:
cc1: warnings being treated as errors
ec_text.c: In function ‘text_input’:
ec_text.c:186: error: assignment makes integer from pointer without a cast

Parece no ser la misma solución, o tal vez me falto algo.


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Eternal Idol en 3 Octubre 2010, 00:06 am
El tipo de retorno de fgets no es el mismo que el de fscanf (int):
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Thelord en 4 Octubre 2010, 21:43 pm
Hey gracias.

Tomando en cuenta lo que me comentas, me eh desecho de algunos warnings, en el caso de _warn_unused_return_ . Pero ahora tengo un Warning distinto:

Código:
cc1: warnings being treated as errors
ec_text_display.c: In function ‘text_print_packet’:
ec_text_display.c:58: error: pointer targets in passing argument 2 of ‘regexec’ differ in signedness
Este el el código de la función 'text_print_packet':
Código
  1.   if (GBL_OPTIONS->regex &&
  2.       regexec(GBL_OPTIONS->regex, po->DATA.disp_data, 0, NULL, 0) != 0) {
  3.      return;
  4.   }
  5.  


No se si es necesario colocar toda la función, pero en estas líneas es donde me aparece el Warning.

Gracias y un saludo.


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Eternal Idol en 6 Octubre 2010, 19:15 pm
¿No es hora de averiguar como generar el ejecutable sin cambiar el codigo?


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Thelord en 9 Octubre 2010, 03:46 am
¿No es hora de averiguar como generar el ejecutable sin cambiar el codigo?

Jeje, tienes razón.

Veré de que forma solucionarlo, cuando lo haga les aviso.
Gracias y un saludo.


Título: Re: _warn_unused_return_ pide retorno de valor en funcion void
Publicado por: Foxy Rider en 9 Octubre 2010, 04:21 am
Podrías sacar el flag -Werror de la compilación para que los warnings no se consideren errores ...

Saludos

P.S : Mismo tema tratado aquí (https://foro.elhacker.net/hacking_linuxunix/ettercap_hibrido_al_borde_de_la_locura-t306693.0.html)