1stack.h(3)                 Library Functions Manual                 stack.h(3)
2
3
4

NAME

6       stack.h - Контролируемый стек
7
8

SYNOPSIS

10       #include 'bee2/defs.h'
11
12

Подробное описание

14       Локальные переменные функций могут размещаться в контролируемом стеке
15       -- области памяти, указатель на которую передается как дополнительный
16       параметр функции.
17
18       Контролируемый стек создается в высокоуровневой функции, передается по
19       цепочке в низкоуровневые функции, очищается и разрушается при
20       завершении высокоуровневой функции.
21
22       Низкоуровневые функции могут не заботиться об утечке данных через
23       контролируемый стек и размещать в этом стеке критические объекты.
24
25       Низкоуровневые функции могут размещать критические объекты не только в
26       контролируемом стеке, но еще в переменных, объявленных с ключевым
27       словом register. При завершении низкоуровневой функции такие переменные
28       должны быть обнулены.
29
30       Значения критических переменных могут определяться через возвращаемые
31       функциями значения (как правило, значения возвращаются через регистр).
32
33       Критические переменные не должны передаваться через обычный стек как
34       параметры функций.
35
36       Пример работы с контролируемым стеком и критической переменной:
37
38       void f2(octet a[], size_t n, octet b[], size_t m, void* stack)
39       {
40           register word sensitive;
41           octet* tmp1 = (octet*)stack;
42           octet* tmp2 = tmp1 + 2 * n;
43           stack = tmp2 + m;
44           ...
45           sensitive = f1(tmp1, 2 * n, stack);
46           ...
47           sensitive = 0;
48       }
49
50
51       Определение функции f, которая использует контролируемый стек, должно
52       сопровождаться определением функции f_deep, которая определяет
53       максимальную глубину стека f. Функция f_deep берет на вход произвольное
54       число аргументов типа size_t (размерностей) или других типов и
55       возвращает глубину стека в октетах.
56
57       Значение f_deep не должно уменьшаться при увеличении любого ее
58       аргумента.
59
60       В описании функции f, использующей вспомогательный стек, должен быть
61       описаны параметры f_deep (схема расчета глубины стека). Схему
62       рекомендуется описывать следующим образом:
63
64       f_deep(     // функция
65           dim1,   // первая размерность
66           dim2,   // вторая размерность
67           ...
68           dimX    // последняя размерность
69       );
70
71
72        Например, f1_deep(n), f2_deep2(n, m), f3_deep().
73
74       Локальные переменные, размещаемые в контролируемом стеке, могут
75       использоваться не в одной, а в нескольких функциях. Эти функции
76       образуют, так называемую, связку. Общие локальные переменные функций
77       связки образуют состояние. Указатель на состояние передается как
78       дополнительный параметр функций связки. Определение связки g должно
79       сопровождаться функцией g_keep, которая возвращает захват стека --
80       длину состояния в октетах. Функции типа _keep имеют такой же интерфейс,
81       как и функции типа _deep.
82
83       Состояние функции связки и ее стек могут размещаться в одном буфере
84       памяти. Тем не менее, указатель на состояние (state) рекомендуется
85       отделять от указателя на стек (stack). Тогда высокоуровневые функции
86       могут более точно рассчитывать суммарный объем контролируемого стека
87       (состояния различных связок надо поддерживать неизменными, а стек -- не
88       обязательно).
89
90       Для стандартизированного оформления описаний в doxygen предусмотрены
91       окружения \deep, \deep{stack}, \keep, \keep{state}.
92

Автор

94       Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
95
96
97
98Библиотека Bee2                 Пт 23 Июн 2023                      stack.h(3)
Impressum