Пример: вычисление размера буфера
Пример: вычисление размера буфера
В предыдущем примере мы выделяли буфер размера BUFFSIZE (определенного в файле unpiрс.h в листинге В.1), и этого было достаточно. К сожалению, не существует простого способа вычислить объем памяти, нужный XDR для кодирования конкретных данных. Вычислить размер структуры вызовом sizeof недостаточно, потому что каждое поле кодируется XDR по отдельности. Нам придется перебирать элементы структуры, прибавляя к конечному результату объем памяти, нужный XDR для кодирования очередного элемента. В листинге 16.15 приведен пример простой структуры с тремя полями.
Листинг 16.15. Спецификация XDR для простой структуры
//sunrpc/xdrl/examplе.х
1 const MAXC = 4;
2 struct example {
3 short a;
4 double b;
5 short c[MAXC];
6 };
Программа, текст которой приведен в листинге 16.16, вычисляет размер буфера, требуемого XDR для кодирования этой структуры. Он получается равным 28 байт.
Листинг 16.16. Программа, вычисляющая размер буфера XDR
//sunrpc/xdr1/example.c
1 #include "unpipc.h"
2 #include "example.h"
3 int
4 main(int argc, char **argv)
5 {
6 int size;
7 example foo;
8 size = RNDUP(sizeof(foo.a)) + RNDUP(sizeof(foo.b)) +
9 RNDUP(sizeof(foo.c[0])) * MAXC;
10 printf("size = %d ", size);
11 exit(0);
12 }
8-9 Макрос RNDUP определен в файле <rpc/xdr.h>. Он округляет аргумент к ближайшему кратному BYTES_PER_XDR_UNIT (4). Для массива фиксированного размера вычисляется размер каждого элемента, который затем умножается на количество элементов.
Проблема возникает в случае использования типов данных переменной длины. Если мы объявим stringd<10>, максимальный размер будет RNDUP(sizeof( int)) (для длины) плюс RNDUP(sizeof(char)*10) (для символов строки). Но мы не можем вычислить размер буфера, если максимальный размер не указан в объявлении переменной (например, float e<>). Лучше всего в этом случае выделять буфер с запасом, а потом проверять, не возвращают ли подпрограммы XDR ошибку (упражнение 16.5).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
3.1 ЗАГОЛОВКИ БУФЕРА
3.1 ЗАГОЛОВКИ БУФЕРА Во время инициализации системы ядро выделяет место под совокупность буферов, потребность в которых определяется в зависимости от размера памяти и производительности системы. Каждый буфер состоит из двух частей: области памяти, в которой хранится
12.3.3.1 Выделение буфера
12.3.3.1 Выделение буфера Обратимся еще раз к алгоритму getblk, рассмотренному нами в главе 3. Алгоритм работает с тремя структурами данных: заголовком буфера, хеш-очередью буферов и списком свободных буферов. Ядро связывает семафор со всеми экземплярами каждой структуры.
14.2. Переполнение буфера
14.2. Переполнение буфера Это одна из самых популярных и в то же время наиболее сложная в использовании уязвимость. Для начала определимся, почему программисты допускают такие ошибки, при которых возможно выполнить переполнение буфера?В таких языках, как С++, для работы с
6.20.2 Использование буфера
6.20.2 Использование буфера Протокол IP, производящий пересылку датаграммы, несет ответственность за ее доставку. Для тех случаев, когда датаграмма по тем или иным причинам не попала в точку назначения, предусмотрен буфер датаграмм, позволяющий произвести операцию
Переполнение буфера
Переполнение буфера Некоторые вирусы и атаки достигают цели без участия пользователя. Несмотря на усилия, интенсивность удаленных атак не снижается, а отражать их становится все труднее. Как это получается? Ведь чтобы программа, пусть и зловредная, что-то сделала, она
14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf
14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf В главе 11 пара fetchmail/fetchmailconf рассматривалась как пример одного из способов отделения реализации от интерфейса. Преимущества Python хорошо иллюстрируются на примере утилиты fetchmailconfВ программе fetchmailconf используется
14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf
14.4.6.2. Учебный пример по Python среднего размера: fetchmailconf В главе 11 пара fetchmail/fetchmailconf рассматривалась как пример одного из способов отделения реализации от интерфейса. Преимущества Python хорошо иллюстрируются на примере утилиты fetchmailconf.В программе fetchmailconf используется
10.6.1. Переполнение буфера
10.6.1. Переполнение буфера Почти псе основные Internet-демоны, включая демоны таких программ, как sendmail, finger, talk и др., подвержены атакам типа переполнение буфера. О них следует обязательно помнить при написании программ, которые должны выполняться с правами пользователя root, а
Вычисление размера кэша
Вычисление размера кэша Когда Firebird читает страницу базы данных с диска, он сохраняет эту страницу в кэше. Обычно размер кэша по умолчанию является достаточным. Если ваше приложение использует соединения из пяти и более таблиц, Firebird Суперсервер может автоматически
Просмотр буфера обмена
Просмотр буфера обмена Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.unit ClipboardViewer;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(tform) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);private FNextViewerHandle : THandle; procedure WMDrawClipboard(var message: TMessage);
2.3.9. Вычисление размера БД
2.3.9. Вычисление размера БД ERwin позволяет рассчитать приблизительный размер БД в целом, а также таблиц, индексов и других объектов через определенный период времени после начала эксплуатации ИС. Для расчета размеров физических объектов служит диалог Volumetrics Editor (рис. 2.99),
Пример. Простановка горизонтального размера
Пример. Простановка горизонтального размера Проставьте горизонтальный размер прямоугольника, например, как изображено на рис. 10.8.Запустите команду DIMLINEAR, вызвав ее из меню Dimension ? Linear или щелчком на пиктограмме Linear на панели инструментов Dimension. Ответьте на
Пример. Простановка параллельного размера
Пример. Простановка параллельного размера Проставьте размер, параллельный измеряемой линии объекта (рис. 10.9).Запустите команду DIMALIGNED, вызвав ее из меню Dimension ? Aligned или щелчком на пиктограмме Aligned на панели инструментов Dimension. Ответьте на запросы:_DIMALIGNEDSpecify first extension line origin or
Пример. Простановка углового размера
Пример. Простановка углового размера Проставьте два варианта углового размера, как на рис. 10.13.Запустите команду DIMANGULAR, вызвав ее из падающего меню Dimension ? Angular или щелчком на пиктограмме Angular на панели инструментов Dimension. Ответьте на запросы:_DIMANGULARSelect arc, circle, line, or <specify
Пример программы, уязвимой к переполнению буфера
Пример программы, уязвимой к переполнению буфера После изучения основ переполнения буфера пришло время рассмотреть пример программы, извлекающей из него пользу, – программы переполнения буфера. В интересах простоты изучения программа должна быть понятной, а каждый