2010-02-09 7 views

Respuesta

-2

Trate de pasar -fno -strict-aliasing a gcc.

Para arrojar luz sobre el tema del alias estricto, verifique question.

+0

Gracias, Gonzalo. No quise remediarlo en el Makefile, ya que solo estoy agregando una característica a una biblioteca existente, pero ahora que lo estoy considerando, no parece un problema. –

+0

Ha. Fácil. Solo necesito superar mi miedo a los Makefiles. –

+2

Desactivar las características para evitar las advertencias del compilador generalmente es una mala idea. Es mejor entender la advertencia y modificar su código. Cuando simplemente abres -fno-strict-aliasing en tu línea de compilación, estás diciendo que el compilador está equivocado. En general, es una buena idea asumir que su código es el problema. Dicho esto, cada ejemplo de código para pasar descriptores de archivos a través de sockets de dominio que he visto fue escrito usando el esquema de desreferenciación en la pregunta original. GCC acaba de comenzar a advertir sobre esto recientemente. – petrsnd

6

A menos que algo esté muy mal, no hay un aliasing real - el objeto al que se hace referencia * (int *) CMSG_DATA (hdr) no es un alias para hdr, ya pasó el final de hdr. La advertencia es incorrecta.

Puede solucionar con memcpy:

memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int)); 

No utilice -fno-estricta-aliasing: que desactiva las optimizaciones que asumen estricta aliasing; podría generar un código considerablemente peor.

Para obtener detalles técnicos, consulte glibc bug 16197.

+1

Estoy de acuerdo con usted, pero si no le preocupa el rendimiento, la opción '-fno-strict-aliasing' es una buena solución, siempre que todos los compiladores que utilice lo admitan. –

+1

Ignorar las advertencias del compilador sin entender lo que está pasando es perezoso y peligroso. Muchas personas se encontrarán con esta pregunta y simplemente procederán con la respuesta aceptada sin entender las implicaciones de -fno-strict-aliasing. La solución memcpy parece una recomendación general más aceptable para mí. – petrsnd

Cuestiones relacionadas