Off-by-one error: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Sistemate "citazioni" domande |
Aggiunto paragrafo "Implementazioni di sicurezza" |
||
Riga 43:
Un esempio di quando un errore di questo tipo si può verificare coinvolge il linguaggio [[MATLAB]], durante l’utilizzo della funzione <code>linspace()</code>. I parametri di questa funzione sono (limite inferiore, limite superiore, numero di valori) e non (limite inferiore, limite superiore, numero di incrementi). Un programmatore che fraintende il terzo parametro, intendendolo come “numero di incrementi”, potrebbe pensare che <code>linspace(0,10,5)</code> genererebbe la sequenza <code>[0, 2, 4, 6, 8, 10]</code>, mentre in realtà l’output sarebbe <code>[0, 2.5, 5, 7.5, 10]</code>.
== Implementazioni di sicurezza ==
Un errore di tipo off-by-one che può minare la sicurezza di un sistema informatico può derivare dall'errato utilizzo della funzione <code>strncat</code> , della [[Libreria standard del C|libreria standard C]]. Fraintendimento comune con questo tipo di funzione riguarda il pensare che il terminatore di sicurezza non verrà scritto oltre la lunghezza massima di una stringa. In realtà ciò accade, e il terminatore verrà scritto esattamente un byte oltre la lunghezza massima consentita specificata. Il codice di seguito presenta un bug di questo tipo:<syntaxhighlight lang="c">
void foo (char *s)
{
char buf[15];
memset(buf, 0, sizeof(buf));
strncat(buf, s, sizeof(buf)); //Il parametro finale dovrebbe essere: sizeof(buf) - 1
}
</syntaxhighlight>Errori di tipo off-by-one sono comuni nell'utilizzo delle librerie C, perché non coerenti tra loro in situazioni nelle quali, come nell’esempio, ci si deve ricordare di sottrarre un byte: funzioni come <code>fgets()</code> e <code>strncpy</code> non scriveranno mai oltre la lunghezza della stringa a loro indicata (<code>fgets()</code> sottrae 1 e restituisce soltanto (lenght – 1) byte), mentre altre come la <code>strncat</code> lo fanno; per questo motivo chi programma deve ricordarsi per quali funzioni sarà necessario sottrarre un byte, e per quali no.
In alcuni sistemi (in particolare architetture di tipo [[Ordine dei byte|little endian]]) questa incoerenza può causare una sovrascrittura dell’ultimo byte significativo del frame pointer. Si crea così una condizione sfruttabile per un aggressore, che può dirottare le variabile locale per la routine di chiamata.
Un approccio utile per cercare di prevenire alcuni problemi è usare varianti di queste funzioni, che calcolino quanto scrivere basandosi sulla lunghezza totale del buffer, piuttosto che sul massimo numero di caratteri da scrivere. Queste possono essere funzioni come la <code>strlcat</code> e <code>strlcpy</code>, spesso considerate più sicure perché rendono più facile prevenire scritture accidentali oltre la fine del buffer (nell'esempio di codice riportato sopra, chiamare <code>strlcat(buf, s, sizeof(buf))</code> risolverebbe il problema).{{Portale|informatica}}
[[Categoria:Terminologia informatica]]
|