typestar

Uniones, campos de bits y comportamiento indefinido

13 pasos en 5 series de C.

Las partes de C que son legales, útiles y capaces de arruinarte la semana. Uniones y disposición de structs, const, volatile y restrict, y después una serie sobre el comportamiento indefinido en sí.

Desbordamiento con signo, strict aliasing, puntos de secuencia: cosas que funcionan hasta que el optimizador nota que tiene permiso de asumir que nunca ocurren. Trece pasos, y es el tour con más probabilidades de cambiar cómo lees las advertencias del compilador.

Empieza este tour

Uniones y disposición

  • UnionesUn bloque de almacenamiento, varias interpretaciones — pero solo una válida a la vez.
  • Una unión etiquetadaLa manera de C de escribir un tipo suma: un enum que dice qué miembro está vivo.
  • BitfieldsMiembros de struct medidos en bits, para empacar flags y contadores chicos.
  • offsetof y disposiciónoffsetof reporta dónde queda un miembro; así funcionan los contenedores intrusivos.
  • Miembros de arreglo flexibleUn arreglo de largo desconocido como último miembro: una sola reserva para encabezado y datos.

Calificadores

  • volatilevolatile le dice al compilador que el valor puede cambiar a sus espaldas.
  • restrictrestrict promete que los punteros no se solapan, y eso deja optimizar al compilador.

Comportamiento indefinido

Válvulas de escape

  • _GenericLa selección por tipo de C11: un nombre de macro, una llamada distinta por tipo.
  • setjmp y longjmpUn salto no local a un punto guardado — lo más cercano a una excepción que tiene C.

Bis

  • value_interp.cUna maquinita de pila sobre una unión etiquetada, con aritmética tipada.

Los otros tours de C