Referencia Zigzkit (SDK consumido)

src/safety/checked.zig

Declaraciones públicas de src/safety/checked.zig (zkit (SDK consumido)).

ImplementadoSin versión del tren todavía· generada desde apps/docs/generated/zig/zkit.json

Página generada desde zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere.

zkit.safety.checked — aritmética que falla con error en vez de desbordar.

En un parser de entrada no confiable (MoQT, H3, MP4, MKV, el codec de conduit/spire) la aritmética sobre campos del wire es donde nacen los desbordes: offset + len que da la vuelta y pasa un bounds check, count * size que se trunca y reserva poco. En ReleaseFast + desborda en silencio; en ReleaseSafe es pánico — un DoS remoto. Aquí todo devuelve error.Overflow o error.OutOfBounds, que el parser propaga como "input inválido".

Reglas que este módulo hace cumplir por tipo:

  • Ningún resultado se trunca: cast falla si el valor no cabe.
  • Los rangos se validan como [offset, offset+len) ⊆ [0, total) sin calcular nunca offset + len con desborde.

safety.checked.Error

const · línea 18

pub const Error = error{Overflow}

Sin ///.

safety.checked.RangeError

const · línea 19

pub const RangeError = error{ Overflow, OutOfBounds }

Sin ///.

safety.checked.add

fn · línea 21

pub fn add(comptime T: type, a: T, b: T) Error!T

Sin ///.

safety.checked.sub

fn · línea 27

pub fn sub(comptime T: type, a: T, b: T) Error!T

Sin ///.

safety.checked.mul

fn · línea 33

pub fn mul(comptime T: type, a: T, b: T) Error!T

Sin ///.

safety.checked.mulAdd

fn · línea 40

pub fn mulAdd(comptime T: type, a: T, b: T, c: T) Error!T

a * b + c sin desborde intermedio.

safety.checked.cast

fn · línea 45

pub fn cast(comptime T: type, v: anytype) Error!T

Convierte v a T o falla si no cabe (nunca trunca, nunca cambia signo).

safety.checked.alignForward

fn · línea 50

pub fn alignForward(comptime T: type, x: T, alignment: T) Error!T

x redondeado hacia arriba al múltiplo de alignment (potencia de dos).

safety.checked.rangeEnd

fn · línea 56

pub fn rangeEnd(offset: u64, len: u64) Error!u64

Fin exclusivo de [offset, offset+len) o error.Overflow.

safety.checked.checkRange

fn · línea 61

pub fn checkRange(offset: u64, len: u64, total: u64) RangeError!void

Valida [offset, offset+len) ⊆ [0, total).

safety.checked.subslice

fn · línea 67

pub fn subslice(comptime T: type, buf: []T, offset: u64, len: u64) RangeError![]T

buf[offset..][0..len] validado (o error.OutOfBounds).