Il crash più celebre in linguaggio C: la CPU e la MMU del sistema operativo intercettano il tentativo del processo di leggere o scrivere in una pagina di memoria non mappata o protetta (es. indirizzo NULL 0x0).
SIGSEGV_NULL_PTR
→
La funzione 'scanf("%d", &x)' si aspetta l'indirizzo di memoria della variabile in cui memorizzare il valore; passare 'x' senza '&' fa sì che il valore contenuto in 'x' venga interpretato come un puntatore, provocando la scrittura a un indirizzo casuale con crash SIGSEGV.
SCANF_MISSING_AMPERSAND
→
La funzione 'memcpy(dest, src, n)' presuppone rigorosamente che le due aree di memoria non si sovrappongano; se i puntatori coincidono o condividono byte, i dati trasferiti vengono corrotti; per aree contigue o sovrapposte è obbligatorio usare 'memmove()'.
MEMCPY_OVERLAPPING
→
Gravissima vulnerabilità e bug logico in C: una porzione di memoria precedentemente liberata con free() continua ad essere letta o scritta attraverso un puntatore obsoleto (dangling pointer).
USE_AFTER_FREE
→
Il compilatore presuppone che puntatori a tipi differenti non puntino alla stessa locazione di memoria; convertire un 'int*' in 'float*' per leggerne la rappresentazione binaria consente al compilatore di riordinare le istruzioni generando bug silenti; il type punning sicuro si effettua tramite 'union' o 'memcpy()'.
STRICT_ALIASING_VIOLATION
→