2014-10-08 18 views
12

Wiem, co to jest przepełnienie bufora . Nie mam jednak pojęcia, co to jest bufor podrzędny .C: Co to jest/przykład niedopełnienia bufora?

Zgaduję, że to jest, gdy konkretny bufor otrzymuje zamiast przepełnienia bajtów, niedomiar bajtów.

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

Powyższe nie dałoby błędu.

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

Powyższy spowoduje przepełnienie bufora jeśli dane wprowadzone przez użytkownika był, na przykład „Deutschland”.

Czy mogę uzyskać przykład kodu, który jest niedomiar?

+1

niektórzy ludzie zmniejszyć ich wskazówek, zamiast zwiększać, aż do punktu, niedomiar może się zdarzyć. prawie to samo, co przepełnienie. – HuStmpHrrr

Odpowiedz

17

Niedopełnienie bufora nie dotyczy bezpośrednio przepełnienia bufora. Jednak niedomiary buforów mogą stanowić problem z np. bufory pierścieniowe.

Rozważmy na przykład odtwarzanie dźwięku: twój bufor audio jest prawdopodobnie buforem pierścieni gdzieś w pamięci jądra. Jeśli zapisujesz dane wolniej niż sterownik audio/sprzęt czyta z bufora, bufor staje się pusty ("niedomiar"), co prowadzi do jąkania dźwięku. Podobne problemy istnieją również w przypadku innych rodzajów przetwarzania danych w czasie rzeczywistym i odtwarzania multimediów.

W ten sposób niedopełnienie bufora często nie jest stanem błędu per se (w przeciwieństwie do przepełnienia bufora, co zwykle powoduje, że programy wykonują niezdefiniowane, niepożądane zachowanie, takie jak zakończenie, wykonanie niepożądanego kodu i tak dalej).

+2

Jeśli bufor przepełni "zwykle" zakończone programy, połowa problemów bezpieczeństwa w systemach komputerowych nie istnieje. – EOF

+0

edytował odpowiedź – dom0

+0

"Opóźnienie bufora" jest bardziej powszechnym terminem, jak sądzę. –

4

Słyszałem od czasu do czasu, że termin ten odnosi się do błędnego odczytu przed rozpoczęciem bufora. Nie wiem, czy to użycie słowa jest "poprawne".

Jako przykład rozważ tę wadliwą implementację stosu.

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

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

Brakujące czek na if (this->top > 0) spowoduje funkcję przeczytać dolna granica tablicy czy pop z już pustym stosie jest wymagana.

-3

Wiem, że to trochę za późno, aby odpowiedzieć na to pytanie. Wszystkie poprzednie odpowiedzi są zadowalające, po prostu myślę, że przykład będzie miał lepszy sens.

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

Output: 4294967295 

Jest to prosty przykład niedomiaru bufora pierścieniowego. Wiemy, że unsigned int nie może reprezentować wartości ujemnych. Jeśli jednak przypiszemy -1 do u, wartość w u jest teraz 4294967295. Jest to 2^32 -1, która jest najwyższą wartością, jaką może przechowywać unsigned int. Przechowywanie wartości niższej niż najniższa daje najwyższą wartość. To jest niedomiar. Mam nadzieję że to pomoże.

+2

To jest nieprawidłowe. Twój przykład to przepełnienie liczb całkowitych. I na marginesie, ponieważ dzieje się to na niepodpisanych danych jest dobrze zdefiniowane. – bolov

0

Istnieje kilka przykładów w PVS V512. Mam problem w gearmad realizacji w fragmencie:

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