Стековий кадрСтековий кадр (від англ. stack frame) — механізм передавання аргументів і виділення тимчасової пам'яті (в процедурах мов програмування високого рівня) з використанням системного стека. ТехнологіяЗазвичай системний стек використовується для зберігання адрес повернення при виклику підпрограм, а також збереження/відновлення значень регістрів процесора. Передача аргументівПри виклику процедури аргументи надсилаються в стек, і тільки потім керування передається у процедуру. Таким чином, процедура отримує стек, на вершині якого лежить адреса повернення, а під нею — аргументи, з якими її викликано. При поверненні з процедури (або після нього, див. нижче) аргументи повинні бути зняті зі стека. Виділення тимчасової пам'ятіЯкщо вказівник стека змістити «вище» (у бік збільшення стека), то частина пам'яті в стеку виявиться невикористаною (зокрема й при виклику третьої процедури) і може використовуватися на потреби процедури, аж до моменту повернення на місце виклику. Таким чином, мови високого рівня організовують змінні, що існують тільки всередині процедури (у мові Сі їх називають «автоматичними»). Перед поверненням процедура має повернути вказівник стека в початкове положення (тобто на адресу повернення). Домовленості для різних мов програмуванняРізні компілятори мов високого рівня по-різному підходять до організації стекового кадру залежно від особливостей апаратної платформи й стандартів конкретної мови. Основні відмінності стосуються порядку передавання аргументів у стек і їх зняття зі стека при поверненні. Недоліки стекового кадруСтековий кадр — зручна технологія виділення тимчасової пам'яті для передавання довільного числа аргументів або внутрішнього використання. Однак вона має низку недоліків. ПродуктивністьПередавання даних через пам'ять без необхідності уповільнює виконання програми (порівняно з програмами мовою асемблера, в яких більшість аргументів і тимчасових даних розміщують у регістрах процесора). Для зменшення звернень до локальних змінних програма оптимізується при компіляції для використання регістрів замість змінних у пам'яті або для зберігання їхніх проміжних значень. Деякі мови використовують домовленості щодо виклику, що підтримують передавання цілочисельних аргументів через регістри. БезпекаСтековий кадр перемежовує дані програми з критичними даними — вказівниками, значеннями регістрів і адресами повернення. Це, в поєднанні з архітектурними особливостями деяких процесорів (а саме — напрямком зростання стека), робить дуже легко досяжним зловмисне перекриття критичних даних внаслідок переповнення буфера (зрозуміло, перш за все, програма має містити помилку, яка дозволить виконати переповнення). Такий «невдалий», з погляду переповнення буфера, напрямок зростання машинного стека мають апаратні платформи x86. Атака з переповнення буфера в стеку зазвичай реалізується так:
Див. також |