Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

• На некоторых системах

alloca
невозможно даже реализовать. Весь мир не является ни процессором Intel x86, ни GCC.

• Цитируя справку [45] (добавлено выделение): «Функция

alloca
зависит от машины и от компилятора. На многих системах ее реализация ошибочна. Ее использование не рекомендуется».

• Снова цитируя справку: «На многих системах

alloca
не может быть использована внутри списка аргументов вызова функции, поскольку резервируемая в стеке при помощи
alloca
память оказалась бы в середине
стека в пространстве для аргументов функции».

45

alloca(3) — Примеч. науч. ред.

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

GCC обычно использует встроенную версию функции, которая действует с использованием внутритекстового (inline) кода. В результате есть другие последствия

alloca
. Снова цитируя справку:

Факт, что код является внутритекстовым (inline), означает, что невозможно получить адрес этой функции или изменить ее поведение путем компоновки с другой библиотекой.

Внутритекстовый код часто состоит из одной инструкции, подгоняющей указатель стека, и не проверяет переполнение стека. Поэтому нет возврата

NULL
при ошибке.

Справочная страница не углубляется в описание проблемы со встроенной

alloca
GCC. Если есть переполнение стека, возвращаемое значение является мусором. И у вас нет способа сообщить об этом! Это упущение делает невозможным использование GCC
alloca
в устойчивом коде.

Все это должно убедить вас избегать

alloca
в любом новом коде, который вы пишете. В любом случае, если приходится писать переносимый код с использованием
malloc
и
free
, нет причины в использовании также и
alloca
.

3.2.5. Исследование адресного пространства

Следующая программа,

ch03-memaddr.c
, подводит итог всему, что мы узнали об адресном пространстве. Она делает множество вещей, которые не следует делать на практике, таких, как вызовы
alloca
или непосредственные вызовы
brk
и
sbrk
.

1 /*

2 * ch03-memaddr.с --- Показать адреса секций кода, данных и стека,

3 * а также BSS и динамической памяти.

4 */

5

6 #include <stdio.h>

7 #include <malloc.h> /* для определения ptrdiff_t в GLIBC */

8 #include <unistd.h>

9 #include <alloca.h> /* лишь для демонстрации */

10

11 extern void afunc(void); /* функция, показывающая рост стека */

12

13 int bss_var; /* автоматически инициализируется в 0, должна быть в BSS */

14 int data_var = 42; /* инициализируется в не 0, должна быть

15 в сегменте данных */

16 int

17 main(int argc, char **argv) /*
аргументы не используются */

18 {

19 char *p, *b, *nb;

20

21 printf("Text Locations:\n");

22 printf("\tAddress of main: %p\n", main);

23 printf("\tAddress of afunc: %p\n", afunc);

24

25 printf("Stack Locations.\n");

26 afunc;

27

28 p = (char*)alloca(32);

29 if (p != NULL) {

30 printf("\tStart of alloca'ed array: %p\n", p);

31 printf("\tEnd of alloca'ed array: %p\n", p + 31);

32 }

33

34 printf("Data Locations:\n");

35 printf("\tAddress of data_var: %p\n", &data_var);

36

37 printf("BSS Locations:\n");

38 printf("\tAddress of bss_var: %p\n", &bss_var);

39

40 b = sbrk((ptrdiff_t)32); /* увеличить адресное пространство */

41 nb = sbrk((ptrdiff_t)0);

42 printf("Heap Locations:\n");

43 printf("\tInitial end of heap: %p\n", b);

44 printf("\tNew end of heap: %p\n", nb);

45

46 b = sbrk((ptrdiff_t)-16); /* сократить его */

47 nb = sbrk((ptrdiff_t)0);

48 printf("\tFinal end of heap: %p\n", nb);

49 }

50

51 void

52 afunc(void)

53 {

54 static int level = 0; /* уровень рекурсии */

55 auto int stack_var; /* автоматическая переменная в стеке */

56

57 if (++level == 3) /* избежать бесконечной рекурсии */

58 return;

59

60 printf("\tStack level %d: address of stack_var: %p\n",

61 level, &stack_var);

62 afunc; /* рекурсивный вызов */

63 }

Эта программа распечатывает местонахождение двух функций

main
и
afunc
(строки 22–23). Затем она показывает, как стек растет вниз, позволяя
afunc
(строки 51–63) распечатать адреса последовательных экземпляров ее локальной переменной
stack_var
. (
stack_var
намеренно объявлена как
auto
, чтобы подчеркнуть, что она находится в стеке.) Затем она показывает расположение памяти, выделенной с помощью
alloca
(строки 28–32). В заключение она печатает местоположение переменных данных и BSS (строки 34–38), а затем памяти, выделенной непосредственно через
sbrk
(строки 40–48). Вот результаты запуска программы на системе Intel GNU/Linux:

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец