typestar

Más comportamiento indefinido en C

Desplazar de más, leer memoria sin inicializar, dividir entre cero — y sus guardas.

#include <limits.h>

int shift_safely(unsigned int value, unsigned int by) {
    if (by >= sizeof(unsigned int) * CHAR_BIT) {
        return 0;
    }
    return (int) (value << by);
}

int divide_safely(int a, int b, int *out) {
    if (b == 0 || (a == INT_MIN && b == -1)) {
        return 0;
    }
    *out = a / b;
    return 1;
}

int initialized(void) {
    int value = 0;
    return value;
}

Cómo funciona

  1. Desplazar por el ancho del tipo es indefinido, no cero.
  2. INT_MIN / -1 desborda, así que la división necesita dos chequeos.
  3. Una lectura sin inicializar puede devolver cualquier cosa.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
21
Caracteres a escribir
345
Tokens
111
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 63 segundos.

Escribe este fragmento

Paso 3 de 3 en Comportamiento indefinido; paso 10 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →