La funzione di ricerca binaria 'bsearch()' presuppone obbligatoriamente che la collezione di elementi sia ordinata in modo crescente secondo la medesima funzione di confronto; passargli un array non ordinato produce mancate corrispondenze e falsi negativi.
BSEARCH_UNSORTED_ARRAY
→
Scrivere il comparatore di 'qsort()' sottraendo semplicemente i valori interi ('*(int*)a - *(int*)b') genera overflow aritmetico se uno dei numeri è molto grande e l'altro negativo; un comparatore che viola la transitività corrompe la sequenza ordinata o causa loop infiniti.
QSORT_COMPARATOR_UB
→
Dimenticare di chiudere i file aperti con 'fclose(fp)' esaurisce la tabella dei file descriptor del processo (limite RLIMIT_NOFILE), facendo fallire tutte le successive chiamate fopen con errore EMFILE.
FILE_DESCRIPTOR_LEAK
→
Tentare di invocare 'pthread_mutex_lock(&mtx)' due volte dallo stesso thread su un mutex di tipo predefinito (PTHREAD_MUTEX_DEFAULT o FAST) congela indefinitamente il thread in attesa del rilascio di se stesso.
PTHREAD_DEADLOCK
→
Passare una stringa assemblata concatenando input proveniente dall'utente alla funzione 'system()' o 'popen()' consente all'attaccante di iniettare caratteri di controllo della shell (come ';', '&&', '|'), eseguendo comandi non autorizzati con i privilegi del processo.
SYSTEM_CMD_INJECTION
→
Le funzioni della libreria standard string.h scansionano la memoria fino a incontrare il byte nullo '0x00'; se l'array non contiene '\0', la funzione continua a leggere o scrivere nella memoria adiacente fino al crash per SIGSEGV o corruzione dello stack.
STRCAT_NO_NULL_TERMINATOR
→
'snprintf(buf, size, ...)' restituisce il numero totale di caratteri che avrebbe scritto se lo spazio fosse stato sufficiente; se il valore restituito è maggiore o uguale a 'size', la stringa è stata troncata; non verificare questo valore genera percorsi o comandi incompleti.
SNPRINTF_TRUNCATION
→
Secondo lo standard C, l'aritmetica dei puntatori è valida solo all'interno dei limiti dello stesso oggetto array o subito dopo la fine; eseguire calcoli come '((char*)NULL) + 10' costituisce comportamento indefinito anche se il puntatore risultante non viene dereferenziato.
NULL_PTR_ARITHMETIC
→