2014-10-08 10 views
12

So che cos'è un buffer overflow . Non ho idea però cosa sia un buffer underflow.C: Che cos'è un/esempio di un underflow del buffer?

Sto supponendo che è quando un buffer specifico riceve invece di un overflow di byte, un underflow di byte.

char buffer[8]; 
fgets(buffer, sizeof(buffer), stdin); 

Quanto sopra non darebbe errore.

char buffer_overflow[8]; 
fgets(buffer_overflow, 16, stdin); 

che questo comporterebbe un overflow del buffer se l'input dell'utente è, ad esempio, "deutschland".

Potrei ottenere un esempio nel codice, che cos'è un underflow del buffer ?

+1

alcune persone diminuire i loro puntatori, invece di aumentare, fino a un certo punto, underflow potrebbe accadere. quasi la stessa cosa di overflow. – HuStmpHrrr

risposta

17

Un underflow del buffer non è correlato direttamente a un overflow del buffer. Tuttavia, i underflow del buffer possono essere un problema con ad es. buffer ad anello.

Considerate ad esempio la riproduzione audio: il vostro buffer audio è probabilmente un buffer circolare da qualche parte nella memoria del kernel. Se si scrivono dati più lenti di quelli del driver audio/hardware dal buffer, il buffer si svuota ("underflow"), causando un audio intermittente. Problemi simili esistono anche per altri tipi di elaborazione dati in tempo reale e riproduzione multimediale.

Pertanto, un underflow del buffer non è spesso una condizione di errore di per sé (diversamente da un buffer overflow, che di solito causa un comportamento non definito, indesiderato come la terminazione, l'esecuzione di codice indesiderato e così via).

+2

Se il buffer supera i programmi "solitamente" terminati, la metà dei problemi di sicurezza nei sistemi informatici non esisterebbe. – EOF

+0

ha modificato la risposta – dom0

+0

"Buffer underrun" è il termine più comune, penso. –

4

Ho sentito occasionalmente usare il termine per riferirsi alla lettura erroneamente prima dell'inizio di un buffer. Non so se questo uso della parola sia "corretto".

Ad esempio, considerare questa implementazione imperfetta di uno stack.

struct fixed_size_stack 
{ 
    int top; 
    int data[128]; 
}; 

int 
fixed_size_stack_pop(struct fixed_size_stack * this) 
{ 
    return this->data[--(this->top)]; 
} 

Il controllo mancante per if (this->top > 0) causerà la funzione per leggere il limite inferiore della matrice se richiesto ostacoli da uno stack già vuoto.

-3

So che è un po 'troppo tardi per rispondere a questa domanda ora. Tutte le risposte precedenti sono soddisfacenti, penso solo che un esempio avrà più senso.

#include<stdio.h> 
int main(){ 
    unsigned int u=-1; 
    printf("%u",u); 
    return 0; 
} 

Output: 4294967295 

Questo è un semplice esempio di underflow del buffer circolare. Sappiamo che int unsigned non può rappresentare valori negativi. Tuttavia, se assegniamo un valore -1 a u, il valore in u è ora 4294967295. Questo è 2^32 -1, che è il valore più alto che può essere memorizzato da unsigned int. Memorizzando il valore inferiore al più basso si ottiene il valore più alto. Questo è underflow. Spero che questo ti aiuti.

+2

non è corretto. Il tuo esempio è overflow intero. E come nota a margine, perché accade su dati non firmati è ben definito. – bolov

0

Ci sono alcuni esempi in PVS V512. Ho avuto il problema in gearmad implementazione in frammento:

pollfd fds[2]; 
    ... 
    memset(fds, 0, sizeof(pollfd)); 
Problemi correlati