Защита от взлома Лекция 10
Обычный вызов функций void f1(void) {…}; // f1() void f2(void) {…}; // f2() void f3(void) {…}; // f3() void main() { f1(); // Вызов f1 f2(); // Вызов f2 f3(); // Вызов f3 };
Дерево вызовов функций
Динамическое ветвление typedef void (*fun)(void); // указатель на функцию void f1(void) {…}; // f1() void f2(void) {…}; // f2() void f3(void) {…}; // f3() Fun table[3] = {f1,f2,f3}; void main() { for (int i=0;i
Использование переменной-флага int flag; // Глобальная переменная void f1(void) {… return 3 }; // f1() void f2(void) {… return 2 }; // f2() void f3(void) {… return 4 }; // f3() void main(){ flag = 1; while (flag!=4) switch (flag) { case 1: flag = f1(); break; case 2: flag = f2(); break; case 3: flag = f3(); break; } };