Подтвердить что ты не робот

Как запретить использование глобальных переменных во время компиляции

Есть ли способ запретить использование глобальных переменных?

Я хочу, чтобы GCC генерировал ошибку во время компиляции, когда определена глобальная переменная.

У нас есть код, который должен быть запущен для каждого потока, и хотите разрешить использовать только стек (который является потокобезопасным)

Есть ли способ обеспечить его соблюдение?

Какой-то флаг GCC или другой способ его проверить?

4b9b3361

Ответ 1

Один из подходов заключался бы в создании файла карты компоновщика (например, опции передачи -Wl, -Map, program.map в gcc) и изучения .data​​strong > и .bss для любых вкладов от объектных файлов, которые вы хотите запустить без глобальных привязок.

Например, если в моем исходном файле hello.c есть:

static int gTable[100];

файл компоновщика ссылок будет иметь в нем что-то вроде этого:

.bss            0x0000000000600940      0x1b0
 *(.dynbss)
 .dynbss        0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
 *(.bss .bss.* .gnu.linkonce.b.*)
 .bss           0x0000000000600940        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
 .bss           0x0000000000600940        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o
 .bss           0x0000000000600940        0x1 /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
 *fill*         0x0000000000600941       0x1f 00
 .bss           0x0000000000600960      0x190 hello.o

Вы можете видеть, что hello.o вносит 0x190 (400) байтов в раздел .bss. Я использовал подход для разбора файла карты ссылок с помощью Python script, чтобы генерировать размер кода и показатели использования ОЗУ для встроенного проекта с разумным успехом в прошлом; формат вывода текста из компоновщика довольно стабилен.

Ответ 2

Нет такой функции в gcc. Некоторое обходное решение было бы включить в процесс сборки инструмент статического анализа, который может определять глобальные переменные. Однако компиляция не подведет, но, по крайней мере, вас каким-то образом будут предупреждать. Я вижу, что PC-Lint (www.gimpel.com) имеет чек на

non const не изменяющиеся во времени глобальные переменные, их обнаружение может помочь многопоточным приложениям в обнаружении ситуаций без повторного участия.

Вероятно, другие инструменты могут включать аналогичную функциональность.

Ответ 3

Я бы использовал ctags, чтобы извлечь символы из исходного кода, а затем выполнить поиск с помощью (perl или python) script для глобальных переменных.

например. следующая строка сообщит вам, содержит ли файл su > глобальные переменные:

ctags -f- hello.c | perl -ne"@a=split(/\t/, $_); if ($a[3] eq qq(v)){ print qq(Has global variables.); exit 0; }"