Runtime Safety

Zig proporciona un nivel de seguridad donde los problemas pueden ser encontrados durante la ejecución. La seguridad puede ser dejada activada o desactivada. Zig tiene muchos casos de lo que se llama comportamiento ilegal detectable, lo que significa que el comportamiento ilegal será detectado (causando un pánico) con la seguridad activada, pero resultará en un comportamiento indefinido con la seguridad desactivada. Se recomienda encarecidamente a los usuarios que desarrollen y prueben su software con la seguridad activada, a pesar de las penalizaciones de velocidad.

Por ejemplo, la seguridad en tiempo de ejecución te protege de índices fuera de límites.

test "fuera de límites" {
    const a = [3]u8{ 1, 2, 3 };
    var index: u8 = 5;
    const b = a[index];
    _ = b;
}
test "out of bounds"...index out of bounds
.	ests.zig:43:14: 0x7ff698cc1b82 in test "out of bounds" (test.obj)
    const b = a[index];
             ^

El usuario puede desactivar la seguridad en tiempo de ejecución para el bloque actual utilizando la función integrada @setRuntimeSafety.

test "Fuera de limites, No seguro" {
    @setRuntimeSafety(false);
    const a = [3]u8{ 1, 2, 3 };
    var index: u8 = 5;
    const b = a[index];
    _ = b;
}

La seguridad está desactivada para algunos modos de compilación (que se discutirán más adelante).

Unreachable

unreachable es una afirmación para el compilador de que esta declaración no será alcanzada. Puede decirle al compilador que una rama es imposible, lo que el optimizador puede aprovechar. Alcanzar un unreachable es un comportamiento ilegal detectable.

Como es del tipo noreturn, es compatible con todos los demás tipos. Aquí se coerciona a u32.

test "unreachable" {
    const x: i32 = 1;
    const y: u32 = if (x == 2) 5 else unreachable;
    _ = y;
}
test "unreachable"...reached unreachable code
.	ests.zig:211:39: 0x7ff7e29b2049 in test "unreachable" (test.obj)
    const y: u32 = if (x == 2) 5 else unreachable;
                                      ^

Aquí se muestra un unreachable siendo utilizado en un switch.

fn asciiToUpper(x: u8) u8 {
    return switch (x) {
        'a'...'z' => x + 'A' - 'a',
        'A'...'Z' => x,
        else => unreachable,
    };
}

test "unreachable switch" {
    try expect(asciiToUpper('a') == 'A');
    try expect(asciiToUpper('A') == 'A');
}
Edita esta pagina Última actualización: 5/15/2024 por Vital