Jeśli alokujemy pamięć na stosie w ten sposób:

void foobar()
{
    int arr[10];
}

Po wyjściu foobar() odwołanie do tego bloku pamięci (arr) zostaje utracone. Ale czy jest wyzerowany?

1
Matinho 15 czerwiec 2021, 00:24

2 odpowiedzi

Najlepsza odpowiedź

Ale czy jest ustawiony na zero?

Nie, może. Nie ma gwarancji co do „wartości” nieprzydzielonej pamięci. Norma nie gwarantuje też w żaden sposób zachowania tej hipotetycznej „wartości”.

Z punktu widzenia bezpieczeństwa informacji: Jeśli przechowujesz prywatne informacje w obiekcie, powinieneś założyć, że informacje mogą trwać nawet po okresie przechowywania obiektu. A atakujący może uzyskać dostęp do tych informacji, jeśli Twój program jest podatny na exploit (zazwyczaj poprzez niezdefiniowane zachowanie).

6
eerorika 14 czerwiec 2021, 21:35

Nie, wartość nie jest ustawiona na zero. Ale nie powinieneś się tym przejmować, ponieważ wartość jest niedostępna. Prawdopodobnie będzie miał wartość tego, co było przed końcem funkcji, ale dostęp do niego będzie Niezdefiniowane zachowanie

Powodem, dla którego prawdopodobnie będzie wartość, jest to, że program po prostu przesunie wskaźnik stosu. Następnym razem, gdy stack dotrze do tego adresu, po prostu przepisze go z potrzebną wartością.

2
Dusan Todorovic 14 czerwiec 2021, 21:51