Перезапись из-за переполнения буфера - PullRequest
0 голосов
/ 05 марта 2019
char A[3] = "AA";
char B[4];

printf("Type : ");
gets(B);

char AB[20];  // just big size
strncpy(AB, A, 3);
strncat(AB, B, 4);

printf("%s", AB);

Да, я знаю, что это уязвимый код (б / с получает).

Если я набираю «BBB», то char AB печатает «AABBB».

Если я набираю «BBBB», то char AB печатает «BBBB»

Я знаю, что переполнение Char B,Но когда я объединяю A & B в больший буфер, A исчезает, почему это происходит?Кто-нибудь может объяснить четко?

1 Ответ

0 голосов
/ 05 марта 2019

Со входом "BBBB", который занимал 5 байтов в памяти - четыре буквы и терминал \ 0 - переменная B расширяется до A.Тогда терминал \ 0 B становится первым байтом A, а затем A теперь является пустой строкой.Сын, когда ты конкатируешь B до A в AB, результат равен B.

...