Skip to content
GUIDES

Related pointer arguments

RFC 0016 checks known helpers under relationships established by their callers. No annotation is needed for this ordinary aliasing pattern:

static void release_then_write(char *a, char *b) {
free(a);
*b = 1; // use-after-free when called with (p, p)
}
static void write_then_release(char *a, char *b) {
*b = 1;
free(a); // the same (p, p) relationship is safe here
}

The checker also distinguishes reset(&p, &p) from reset(&p, &q) when both cells initially contain one allocation: replacing *out changes the first cell, while a saved copy can still refer to the released value. Supported record fields, selected elements, globals and actual callback targets carry the same contextual checking across files and compiler objects. An ownership annotation on a known definition does not skip its body checks.

Errors name the operation in the helper, with a note at the originating call when available. --dump-analysis displays call-context entries containing relative aliases, distinct objects, entry facts and the resulting summary. Facts describe values on entry; subsequent writes still update or invalidate them. WEAVEC_UNSAFE retains effects and suppresses contextual reports from that call, including delayed checking in another file.

An unresolved required relationship, unavailable view or exceeded context bound reports analysis-incomplete and retains ordinary call effects. Calls whose inputs have no established interacting relationship still use generic summaries; silence does not prove arbitrary pointers disjoint. The validation report records the supported matrix and remaining coverage limits. These context records are retained in the current format 24 sidecars; rebuild older objects before link analysis. Checked mode also specializes exact scalar inputs and fields under the same context limits (RFC 0019).