Итак, я понимаю, что этот вопрос задавался ранее.Я до сих пор не понимаю следующее:
#include <stdio.h>
main() {
volatile int (*fp)();
char buffer[64];
fp = 0;
if(fp){
printf("Buffer Overflow, jumping to %p", fp);
fp();
}
}
Первая строка объявляет указатель функции fp.В третьей строке указывается значение 0, которое должно быть эквивалентно адресу 0 (&0
), указателю функции.Теперь это содержимое адреса памяти, на который указывает указатель.Поэтому оператор if никогда не должен становиться правдой.Тем не менее, должно стать правдой, оно будет исполненоЕсли это было выполнено, функция printf печатает адрес, который теперь хранится в моем указателе fp.
Но что делает последняя строка (fp()
)?Для меня это выглядит так, как будто я пытался вызвать функцию fp (), адрес которой указывает мой указатель fp.Но эта функция не была определена в этом коде.Итак, что это делает?