avva: (Default)
[personal profile] avva
(эта запись будет интересна программистам, знающим C, и сочувствующим)

Две задачки - первая старая и известная, вторую только что придумал.

1. Напишите код на C, который определяет, в какую сторону растет стек на машине, где его запустили - вверх или вниз.

2. Напишите код на C, который проверяет, кто очищает стек от аргументов в конце работы функции - сама функция или тот, кто ее вызывает, после ее возвращения.

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

Комментарии скрывать не буду. Очень рекомендую подумать самому перед тем, как смотреть на решения там.

Date: 2009-09-17 11:21 am (UTC)
a_p: (Default)
From: [personal profile] a_p
про первую задачу уже все написали, а для решения второй нужно передать больше аргументов, чем описано в прототипе функции (если прототипа нет, то очистка делается вызывающим кодом) и проверить, не поехал ли стек после возврата функции. Проверку эту можно сделать, определив в вызывающем коде три локальные переменные (подряд), присвоив им разные значения перед вызовом функции и проверив значение средней после возврата. Разумеется, нужно будет запретить оптимизации и, возможно, квалифицировать наши три переменные как volatile)

Date: 2009-09-17 11:22 am (UTC)
From: [identity profile] avva.livejournal.com
С переменными не так просто - я так тоже хотел (только через массив), но надо учесть адресацию через ebp и ее аналоги на других платформах. См. тред выше, который начал mgar, там все подробности.

Date: 2009-09-17 11:32 am (UTC)
a_p: (Default)
From: [personal profile] a_p
Ну, если с локальными переменными платформонезависимым образом нельзя, то тогда остаётся повторять вызов с "неправильным" числом параметров и посмотреть изнутри вызванной функции, совпадают ли значения её аргументов с переданными. Предварительно надо будет решить задачу 1, чтобы понять, больше или меньше надо передавать аргументов.

Date: 2009-09-17 11:51 am (UTC)
From: [identity profile] unbe.livejournal.com
Изнутри вызываемой функции проверить ничего не получится, т.к. у нее стек всегда в порядке

Date: 2009-09-17 12:01 pm (UTC)
a_p: (Default)
From: [personal profile] a_p
если функция определена с двумя параметрами, а мы вызываем её с одним, то каково будет значение этих параметров, если смотреть изнутри?

Date: 2009-09-17 12:20 pm (UTC)
From: [identity profile] unbe.livejournal.com
Это верно, вариант того, что avva написал выше. Я не сразу понял, что имеется в виду

Date: 2009-09-17 12:51 pm (UTC)
a_p: (Default)
From: [personal profile] a_p
Ага, оно. Только у меня, действительно, потуманнее написано :)

Date: 2009-09-17 11:32 am (UTC)
From: [identity profile] dmarck.livejournal.com
Только не три переменные, а массив - иначе компилятор может перетасовать.

Date: 2009-09-17 11:33 am (UTC)
a_p: (Default)
From: [personal profile] a_p
вот ведь гад! Согласен, с массивом лучше.

Date: 2009-09-17 11:36 am (UTC)
From: [identity profile] dmarck.livejournal.com
И то непонятно - потому что вообще говоря нет гарантий, что локальный массив будет обязательно размещён в стеке, а не через какой-нибудь дикий зон-аллокатор. Вроде бы стандарт языка это прямо не запрещает.

Date: 2009-09-17 11:43 am (UTC)
a_p: (Default)
From: [personal profile] a_p
да, а старый верный alloca уже вообще не везде имплементирован (я там ниже приблизительно написал про способ без использования локальных переменных вызывающей функции).

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 06:45 pm
Powered by Dreamwidth Studios