Форум программистов, компьютерный форум CyberForum.ru

Как обмануть компилятор и "перепрыгнуть через функцию"? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ vector<[class]> in class и перегрузка (ostream) http://www.cyberforum.ru/cpp-beginners/thread935871.html
Доброе всем время суток ) столкнулся с проблемой Есть у меня несколько классов и есть класс внутри которого созданы векторы хранящие элементы других 3-х классов Пытался перегрузить острим для вывода на консоль содержимого класса и вот попал в капкан ) возможно даже своей криворукости так как только изучаю STL вообщем так работает и выводит ostream& operator<<(ostream& os,const...
C++ Структура в классе Здраствуйте! Хотел спросить можно ли использовать структуру в классе и соответствует ли оно принципам ООП? #include <iostream> #include <cmath> using namespace std; class Quad { protected: struct coord http://www.cyberforum.ru/cpp-beginners/thread935858.html
ошибка в коде C++
#include <string.h> #include <iostream> #include <stdio.h> int main() { char m1="=id"; char m2; char m3;
C++ Как програмно узнать сколько элементов в перечислении?
Допустим, есть такое перечисление. enum Month{JANUARY=1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER}; sizeof(Month) показывает размер одного элемента
C++ EOF что это http://www.cyberforum.ru/cpp-beginners/thread935822.html
В книге встречается записи типа ..если встретится указанный символ-ограничитель, по умолчанию это EOF... Что за EOF?
C++ Использование printf в функции Подскажите, пожалуйста: передаю в функцию два параметра для вывода void fun(string x, int y) { printf("%s%d",x,y); } надо, чтобы вывел подробнее

Показать сообщение отдельно
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
09.08.2013, 22:15  [ТС]     Как обмануть компилятор и "перепрыгнуть через функцию"?
Kastaneda, Спасибо, но я всё-таки решил проблему. Хотя решение довольно узкоспециализированное. Ни о какой расширяемости, универсальности речи не идёт. К тому же ещё и от компилятора зависит.

1) Надо убедиться, что компилируешь в release а не debug
(я это и так пробовал, но потом случайно переключил в debug)
В дебаге компилятор забивает в стек ещё кучу всяких дополнительных регистров помимо просто ebp, тем самым ломая наше представление о том, где какие данные лежат.
2) ВОТ! Работает! Чтобы просто сделать возврат с прыжком через функцию, надо просто очистить стек от данных, вставленных туда при втором вложенном вызове. Выглядит это так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
int get6(){
    _asm{
        pop ebp;//выкинуть ebp, вставленный при вызове get6
        pop ebp;//выкинуть адрес возврата в get5
    }
    std::cout<<"return 6 triggered"<<std::endl;
    return 6;//теперь на вершине стека ebp и адрес возврата, сохранённые при вызове get5 
//из main
// и return будет доставать их из стека, думая, что это "адрес возврата в get5"
// но мы ж его выкинули - и теперь на вершине стека аналогичные данные, 
// только для возврата в main
}
int get5(){
    std::cout<<"get6 called"<<std::endl;
    get6();
    std::cout<<"return 5 triggered"<<std::endl;
    return 5;
}
int main(){
    std::cout<<"get5 called"<<std::endl;
    int n=get5();
    std::cout<<"returned "<<n<<std::endl;
    std::cout<<"return from get5 not triggered"<<std::endl;
    return 0;
}
Добавлено через 2 минуты
Естественно это работает только, если компилятор ничего больше в стек не пихал. Например в обеих этих функциях не случайно нет локальных переменных - они бы усложнили дело, будучи тоже в стеке.
 
Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru