Como sabemos, el estándar C no especifica muchos detalles de la implementación, por ejemplo, el valor del puntero NULL, el orden de los bits y bytes (endiannes), la alineación en las estructuras y los parámetros de la pila, la organización real de la memoria (no No creo que el diseño de la pila sea necesario en absoluto, solo "automático".
Además, algunas otras partes están definidas (o no definidas) para producir un comportamiento indefinido, como la eliminación de referencias nulas (comúnmente segfault pero no necesariamente)
Dado que las plataformas modernas (¿o depende del compilador?) (¿intencionalmente?) se comportan de manera similar, es realmente peligroso confiar en algunos comportamientos consistentes de los programas.
Entonces, ¿existe una variante de Unix o una plataforma inspirada en Unix (o un compilador si depende principalmente del compilador?) que sea estándar pero intencionalmente extraño para producir errores y señalar un comportamiento indefinido y la falta de portabilidad?
¿Hace algo similar? cosa existe pero para POSIX en lugar de C? ¿Es incluso algo razonable para probar e implementar?
Respuesta aceptada:
HP-UX de Hewlett Packard es lo más cercano que se me ocurre.
El compilador de C permitirá la desreferenciación de puntero NULL, aunque había un indicador para cambiar esto. La pila creció "hacia arriba" (hacia direcciones más grandes) y el montón creció hacia abajo (hacia direcciones más pequeñas) en el hardware PA-RISC.
El hardware PA-RISC también tenía algunas rarezas más allá de la inversión de pila/montón. Tenía un registro de segmento (funcionaba de manera diferente a los segmentos x86), por lo que varias bibliotecas realmente vivían en diferentes segmentos, y los punteros a funciones no eran un solo puntero de 64 bits. Sin embargo, no recuerdo si PA-RISC era tan estricto con la alineación de punteros como lo era SPARC.
En un nivel un poco más disponible, puede usar compiladores de C como Clang, Pcc o incluso Tcc, aunque Tcc tiene algunos problemas con los enlazadores y cargadores de GNU debido a los "símbolos débiles", según tengo entendido. Como mínimo, recibirá diferentes mensajes de advertencia de estos compiladores alternativos, lo que siempre vale la pena.
También puede probar bibliotecas C alternativas, como Diet Libc o Musl. He tenido código que hace cosas diferentes cuando se compila contra Musl en lugar de GNU Libc. Ambas bibliotecas admiten enlaces estáticos, lo que GNU Libc dificulta o imposibilita. Musl incluso tiene un sistema de enlace dinámico muy diferente, que podría exponer errores latentes en su código.
Relacionado:Ubuntu:¿cómo hacer que pam_exec ejecute el script como el usuario actual?