Простая и интересная задачка по C++

Всем привет, я сам ещё новичок в C++(< 2 лет изучаю), но уже что-то понимаю и решил сделать задачу на основы языка для совсем зелёных, для решения из C++ вам нужно будет знать функции, cout и указатели.


Итак, задача:

Дан следующий код: http://pastebin.com/5ehUmhZB


Результат его выполнения:

Hello, World
secret function 42

Вопросы:

1 Почему выводится secret function 42, если вызывается только printHelloWorld(); 

2 Откуда взялось число 42?


Подсказки:

1 Не потому что 42 - это ответ на «главный вопрос Жизни, Вселенной и Всего Остального»

2 На других архитектурах и компиляторах результат может быть другим, я компилил в linux gcc 5.4.0 x64


P.S. Если не верите, можете убедиться сами https://www.tutorialspoint.com/viewproject.php?URL=compile_cpp_online.php&PID=0Bw_CjBb95KQMTW9WaTliUXRqc1U

Лига программистов C/C++

61 пост4.8K подписчика

Добавить пост

Правила сообщества

Соблюдайте правила Pikabu:

https://pikabu.ru/html.php?id=wtf


Помимо этого ЗАПРЕЩЕНО:

- Размещать в сообществе посты стиля "Подскажите как удалить вирус", "Подскажите как установить программу", "Подскажите как починить монитор/телевизор/мышь/тостер/стиральную машину" или "Напишите за меня лабу в универ". Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.

12
Автор поста оценил этот комментарий

За такие манипуляции со стеком - расстрел через повешение без права досрочного освобождения.

раскрыть ветку
8
Автор поста оценил этот комментарий

long *ptr = (long *)&ptr + 3;

*ptr = (long)&func1;

В стеке есть адрес возврата из printHelloWorld, вместо него вставлен адрес func1.

*((int *)ptr - 1) = 052;

"var", который в другой функции, тоже находится в стеке и здесь мы его фиксим на значение 42.


Короче, такой фигнёй лучше на ассемблере заниматься -- понятнее и портабельнее будет.

раскрыть ветку
5
Автор поста оценил этот комментарий
Новичкам не стоит заниматься подобной хренью имхо
3
Автор поста оценил этот комментарий
Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Такого количества говнокода я в одном месте 100 лет не видел! = )

Лучше бы код научился переносимый писать, а то умников которые знают как стек имппользуется полно, а вот приложение под несколько архитектур написать - нет.

раскрыть ветку