В следующем коде:Почему это переполнение?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;
strcpy(password_buffer, password);
if(strcmp(password_buffer, "brillig") == 0)
auth_flag = 1;
if(strcmp(password_buffer, "outgrabe") == 0)
auth_flag = 1;
return auth_flag;
}
int main (int argc, char *argv[]){
if(argc < 2){
printf("Usage: %s <password>\n", argv[0]);
exit(0);
}
if(check_authentication(argv[1])){
printf("\n-=-=-=-=-=-=-==-=-=-\n");
printf(" Access Granted\n");
printf("-=-=-=-=-=-=-==-=-=-\n");
}
else {
printf("Access Denied\n");
}
}
если я бегу что-то такое, как «AAAAAAAAAAAAAAAAAAAA», как-то что-то переполняется, и это приводит к тому, запуск программы, как доступ предоставлен. Я смущен, потому что, когда я запускал отладчик gdb, auth_flag был до password_buffer в памяти, и он никогда не переполнялся.
EDIT: Я понимаю, что текст не вписывается в буфер, но я экспериментирую с переполнением буфера и как использовать их контролируемым образом. Да, мы могли бы сделать массив крупнее, но дело не в этом
Мне было интересно, сможет ли кто-нибудь сказать мне, почему это происходит/что переполняется, чтобы вызвать это.
Когда вы задаете размер буфера, он должен быть длиной + 1, так как ему нужен конечный нулевой символ. – Glenn
Как уже объяснялось, вы вызываете Undefined Behavior. Поэтому стандартного ответа не может быть. Любой ответ зависит от системы, компилятора и используемых параметров компиляции. Поэтому, если вы действительно хотите получить достойный ответ, вам необходимо предоставить эту информацию. – kaylum