_warn_unused_return_ pide retorno de valor en funcion void

Iniciado por Thelord, 1 Octubre 2010, 18:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Thelord

Hola, buen día a todos.

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


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:
Cita de: ^Tifa^ en 31 Diciembre 2008, 14:21 PM
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  ;)

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.


Eternal Idol

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:


void disable_ip_forward(void)
{
   FILE *fd;
   int ir; //items read
   
   fd = fopen("/proc/sys/net/ipv4/ip_forward", "r");
   ON_ERROR(fd, NULL, "failed to open /proc/sys/net/ipv4/ip_forward");

   ir = fscanf(fd, "%c", &saved_status);
...


PD. Encima es C ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Thelord

Gracias.

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


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):


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.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Thelord

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:


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':
   if (GBL_OPTIONS->regex &&
       regexec(GBL_OPTIONS->regex, po->DATA.disp_data, 0, NULL, 0) != 0) {
      return;
   }



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.

Eternal Idol

¿No es hora de averiguar como generar el ejecutable sin cambiar el codigo?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Thelord

Cita de: Eternal Idol en  6 Octubre 2010, 19:15 PM
¿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.

Foxy Rider

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í