Przede wszystkim nie korzystaj z get.By teraz prawie wszyscy znają wszystkie problemy związane z bezpieczeństwem i niezawodnością, które mogą wystąpić podczas pobierania. Ale uwzględniono to również z przyczyn historycznych, ponieważ jest to bardzo dobry przykład złego programowania. wygląd
Let na wszystkich problemów z kodem:
// Really bad code
char line[100];
gets(line);
Bo dostaje nie robić granice sprawdzanie ciąg dłuższy niż 100 znaków zastąpi pamięć. Jeśli masz szczęście, program się po prostu zawiesza. Może to dziwne zachowanie.
Funkcja uzyskiwania jest tak zła, że łącznik GNU gcc wydaje ostrzeżenie, gdy jest używany.
/tmp/ccI5WJ5m.o(.text+0x24): In function `main':
: warning: the `gets' function is dangerous and should not be used.
Protect macierz dostępów z assert
C/C++ nie robi sprawdzanie zakresu.
na przykład:
int data[10]
i = 20
data[20] = 100 //Memory Corruption
funkcja Zastosowanie Assert dla powyższego kodu
#include<assert.h>
int data[10];
i=20
assert((i >= 0) && (i < sizeof(data)/sizeof(data[0]))); // throws
data[i] = 100
przepełnienia Array są jednym z najczęstszych błędów programistycznych i są bardzo frustrujące, aby spróbować zlokalizować. Ten kod nie eliminuje ich, ale powoduje, że błędny kod jest przerywany wcześniej w sposób, który znacznie ułatwia znalezienie problemu.
Użyj Snprintf (bufor, sizeof (bufor), "% s", "abcdefghpapeas") i niektóre narzędzia, takie jak valgrind, GDB.
Mam nadzieję, że to pomoże ..
Dlaczego tagujesz pytanie C++, a następnie piszesz kod w ten sposób? –
Czy nie byłoby bardziej logiczne unikanie tego na pierwszym miejscu? Na przykład, używając 'snprintf (bufor, sizeof (bufor),"% s ", ...)' – mvp
Jest tam, aby wykryć, czy stos jest rozbity, aby nie wykryć przepełnienia bufora. Użyj więcej znaków. –