GNU/Linux >> Tutoriales Linux >  >> Linux

¿Existen tiempos de ejecución o compiladores C "esotéricos" (raros) pero que cumplen con los estándares?

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?
Linux
  1. ¿Existen convenciones de nomenclatura para las variables en los scripts de Shell?

  2. N ¿Equivalente a Top pero para E/S de red?

  3. ¿Hay alguna forma de verificar si hay enlaces simbólicos que apuntan a un directorio?

  4. ¿En qué idiomas están escritos Windows, Mac OS X y Linux?

  5. ¿Existen códigos de estado de salida estándar en Linux?

No hay repositorios habilitados solución RHEL

¿Por qué algunos emoji en blanco y negro y otros son demasiado grandes?

¿Existen alternativas al centro de software?

Algunas carpetas y/o archivos en HDD externo son accesibles en Linux pero no en macOS y Windows

¿Por qué timer_t está definido en time.h en Linux pero no en OS X?

¿Por qué hay `/lib` y `/lib64` pero solo `/bin`?