Стек вызовов - часть 2 - уязвимость переполнения буфера

По большому счёту, большая часть уязвимостей стека связана не с самим стеком с точки зрения абстрактного типа данных, а с нарушением правил этого абстрактного типа данных. Дело в том, что стек вызовов должен быть реализован максимально близко к аппаратному уровню для максимальной производительности, так как все программы, написанные на языках высокого уровня так или иначе используют функции (повторяющиеся блоки кода) - а значит - используют стек. При таком приближении к аппаратному уровню, конечно, описание АТД отсутствует как таковое и полагается, что код, работающий со стеком, будет учитывать его структуру и не приведёт к его нарушению.

Стек вызовов - часть 1 - структура

Стек является фундаментальной структурой данных, а стек вызовов - одно из великих изобретений в информатике. Ведь он позволяет выполнять программу, которая написана с помощью функций, а без использования повторяющихся блоков кода невозможно написать большую программу, так как объём кода будет расти с огромной скоростью.

Как правило, память под стек вызовов выделяется операционной системой для каждого процесса.

XOR-swap или как поменять переменные местами без временной переменной

Для того, чтобы поменять местами информацию из 2 блоков памяти совершенно не обязательно копировать один из них, записывать в него второй блок, а затем сохранённое значение записывать во второй блок.

Казалось бы, это невозможно сделать, потому что как можно “запомнить”, что было в ячейке до перезаписи. Машина ведь не может “жонглировать” переменными или параллельно читать и записывать в одни и те же переменные.

Единицы измерения информации - откуда путаница и как на ней зарабатывают?

Вся информация на компьютерах хранится в виде последовательностей битов. К сожалению, близость значений 2^{10} = 1024 и 10^3 = 1000 привела к путанице при измерении количества информации.

Изначально различали метрическую единицу 1 килобайт = 1000 байт и двоично-десятичную единицу 1 Кбайт = 1024 байта.

Goto - вред или быстродействие?

Споры по поводу оправданности использования оператора goto в языках высокого уровня ведутся ещё с 1968 года, то есть больше 50 лет. Придти к окончательному выбору невозможно, поскольку как использование, так и полный отказ от оператора goto имеет свои достоинства и недостатки.

Очевидно, что ни одна нормальная программа не может работать без переходов на уровне машинных кодов, так как ни цикл, ни проверку условия, ни вызов/возврат значения из функции невозможно сделать команд явного или условного перехода. То есть программа без переходов, согласно принципам Фон Неймана, может выполняться только последовательно.

Pagination


Copyright © 2019 Александр Майоров. Все права защищены.