Tengo que portar el código fuente desde una plataforma ARM que ejecuta Linux. Lamentablemente me he topado con problemas de acceso a memoria no alineados. La fuente utiliza moldes de puntero y acceso en gran medida.Solución de acceso de memoria no alineada ARM
El código como el siguiente se ha extendido por la base de código como un virus. Puedo identificar las ubicaciones problemáticas gracias a la opción de línea de comandos gcc -Wcast-align
, pero hay más de mil instancias por recorrer.
u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H)
|| (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L))) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);
(*(IEC_ULINT*)pSP).H += u.H;
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H)
&& ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0);
Usando echo 2 > /proc/cpu/alignment
en el Kernel de Linux hace que arreglar los problemas, pero el rendimiento de la aplicación se degrada a un punto que no es aceptable más.
Busqué en la red algo así como una palabra clave __unaligned
o __packed
para el compilador GCC (v4.4.1), pero aún estaba vacía.
Pensé que muchas de las líneas de código poblemáticas se podían arreglar con una expresión regular/reemplazo más o menos compleja, pero ahora, después de hacer eso por un tiempo, veo que también este enfoque tomará enormes cantidades de trabajo tedioso.
¿Tienen alguna sugerencia de cómo hacer este trabajo? Creo que un plugin de compilador de gcc 4.5 sería exagerado, pero ¿hay algo mejor que las expresiones regulares? ¿Qué otras sugerencias puedes proponer? No necesariamente todas las instancias problemáticas deben ser reparadas, ya que aún puedo confiar en Kernel para algunos casos más raros.
Tengo la tentación de bromear con que esto se debe mover a TheDailyWTF.com. – Crashworks
Continuando con nuestro estudio de la lingüística moderna, aquí tenemos una muestra del dialecto de C comúnmente utilizado por los programadores embebidos. Aproximadamente traducido al inglés, el texto de arriba significa "F *** YOU!", Aunque ningún lenguaje natural puede transmitir la cantidad de rencor, desafío contra todo lo que es sagrado y desprecio general por la humanidad del lector transmitida aquí. – Dmitri