Hoy encontré un problema muy extraño. En resumen, mi función devuelve un valor, la persona que llama obtiene un valor diferente. En algún lugar alrededor de mi código que tengo una llamada a:Función C cambio de valor a la vuelta. Pila corrupta?
Message* m = NULL;
m = connection_receive(c);
Dónde connection_receive se define como sigue:
Message* connection_receive(Connection* c)
{
Message* k;
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
k = NULL;
else
k = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
/* Until here, k is reachable and contains the correct data. */
return k;
}
else
return NULL;
}
Aquí está un funcionamiento GDB, me detuve justo antes del retorno y justo después de la misión:
222 return k;
(gdb) p k
$1 = (Message *) 0x7ffff0000950
(gdb) n
226 }
(gdb) n
main() at src/main.c:57
57 if (m)
(gdb) p m
$2 = (Message *) 0xfffffffff0000950
Por supuesto, si intentamos acceder a 0xfffffffff0000950, tendremos un error de segmentación.
Si cambio la función y en lugar de devolver un valor, utilizando un segundo parámetro para pasar el valor funciona, pero me gustaría saber qué salió mal en este caso.
Muchas gracias.
EDITAR: Esto funciona, pero no es conveniente. Y también me gustaría saber por qué ocurre un error tan extraño.
void connection_receive2(Connection* c, Message** m)
{
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
*m = NULL;
else
*m = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
}
else
*m = NULL;
}
Edit2: resuelto. Gracias a todos. El problema era un error tipográfico en el archivo de encabezado. No puedo usar -Werror porque necesito hacer cosas que levantan algunas advertencias, y en una salida grande y un encabezado grande, lo perdí.
Tuve que suceder una vez. 'fin' mostró un valor de retorno y la variable en la que se almacenó mostró otro. Una recompilación lo arregló para mí (ni siquiera cambió la fuente); Lo mejor que puedo adivinar es que un archivo objeto dependiente no se volvió a compilar, de lo contrario posiblemente un error (raramente encontrado) en gcc. – Kevin
Debe reducir esto a [SSCCE] (http://sscce.org/) que demuestre el problema y lo publique; no hay nada de malo con el código que ha publicado; el problema está en otra parte. –
@BrianRoach, veré qué puedo hacer. Es un gran proyecto. – Victor