Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

После выполнения return перейти в любую часть программы, кроме точки вызова

#c #cpp


Как сделать так, чтобы после выполнения return перейти в любую другую часть программы,
вместо точки вызова функции?
Ответ даже предположить не могу :(    


Ответы

Ответ 1



Это одно из безумных заданий на собеседованиях, когда предлагают сделать полную чушь и написать код, за который в жизни следует отрывать руки, вместо того, чтобы проверить реальные знания кандидата? Как вариант, задефайнить return: #include #define return goto ll void main() { return; printf("You shouldn't see this\n"); ll: printf("After return\n"); } Вариант второй - подменить адрес возврата, смоделировав переполнение буфера (рассказывая про стек вызовов, предлагаю этот пример студентам). Замечания: (1) работает только на 32-х битах, (2) после вывода строки программа, разумеется, рухнет. Оба недочета легко поправить, предлагаю сделать это самостоятельно. #include void non_called_function() { printf("You shouldn't see this\n"); } void f() { int testArray[1]; // Замещаем адрес возврата в main адресом non_called_function testArray[2] = (int) non_called_function; } int main() { f(); return 0; }

Ответ 2



Если нужно, чтобы переход происходил именно по return, это одно дело. Если же просто в конце функции, то посмотрите в сторону long_jmp. Хотя, на самом деле, я бы такими вещами занимался в самом крайнем случае.

Ответ 3



А, если использовать безусловный переход goto ?

Комментариев нет:

Отправить комментарий