Глобальные переменные являются переменными, которые отображаются в программе (если не затененный локальными переменными). Анализ Code Prover делает определенные предположения об инициализации глобальных переменных.
main
Функция существуетЕсли ваш код содержит main
функция, верификация Code Prover полагает, что глобальные переменные инициализируются согласно ANSI® C стандарты. Значения по умолчанию:
0 для int
0 для char
0.0 для float
и так далее.
Иногда, вы можете хотеть проверять, инициализируются ли глобальные переменные явным образом в коде. Например:
В горячей перезагрузке, чтобы сэкономить время, не загружается bss сегмент программы, которая может содержать значения переменных от предыдущего состояния. Вместо этого программа, как предполагается, явным образом инициализирует все переменные неconst без значений по умолчанию перед выполнением. Можно разграничить этот код инициализации и проверить, что все глобальные переменные неconst действительно инициализируются в горячей перезагрузке.
Чтобы разграничить раздел кода как код инициализации, введите прагму polyspace_end_of_init
в main
функция. Код инициализации начинается с main
функционируйте и продолжается до этой прагмы. Используйте эти опции, чтобы проверять код инициализации только и определить, инициализируются ли все глобальные переменные в этом разделе кода:
Анализ Code Prover сообщает о неинициализированных переменных с помощью красных или оранжевых результатов в коде инициализации для проверок:
Чтобы только проверять, инициализируются ли глобальные переменные явным образом при использовании, используйте опцию Ignore default initialization of global variables (-no-def-init-glob)
.
Анализ Code Prover сообщает о неинициализированных переменных с помощью красных или оранжевых результатов для проверки Non-initialized variable
.
main
Функция не существуетЕсли ваш код не имеет main
функция, Code Prover начинает проверять каждую невостребованную функцию учитывая, что глобальные переменные имеют полнофункциональное значение, ограниченное только их типом данных. См. также Предположения О Переменных диапазонах От Типов данных.
Например, рассмотрите этот пример:
int glob; void func1_callee(); void func1() { int loc = glob; if(!glob) func1_callee(); } void func1_callee() { int loc = glob; } void func2() { int loc = glob; }
func1
и func2
, глобальная переменная glob
и следовательно локальная переменная loc
имеет полный спектр int
значения.Однако только невостребованные функции начинаются с полнофункциональных значений глобальных переменных. Функциональный func1_callee
называется в func1
после значения glob
ограничивается обнулить. В func1_callee
, глобальная переменная glob
и следовательно локальная переменная loc
имеет ограниченный нуль значения.
Программное обеспечение использует фиктивный функциональный _init_globals()
инициализировать глобальные переменные. _init_globals()
функция является первой функцией, неявно вызванной в main
функция (или сгенерированный main
функционируйте, если нет никакого main
).
Считайте следующий код в приложении gv_example.c
.
extern int func(int); int garray[3] = {1, 2, 3}; int gvar = 12; int main(void) { int i, lvar = 0; for (i = 0; i < 3; i++) lvar += func(garray[i] + gvar); return lvar; }
После верификации:
На панели Results List, если вы выбираете File из списка под узлом gv_example.c
, вы видите _init_globals
.
На панели Variable Access, gv_example._init_globals
представляет инициализацию глобальной переменной. Столбец Values показывает значение глобальной переменной сразу после инициализации.
В следующей таблице перечислены то, что проверяется на каждый тип данных, чтобы определить инициализацию. Проверка происходит во время операций чтения для проверки Non-initialized variable и в конце раздела инициализации для проверки Global variable not assigned a value in initialization code.
Тип данных | Какая зеленая проверка на средние значения инициализации |
---|---|
Фундаментальные типы (int 'double' , и т.д.) | Переменная записана, по крайней мере, однажды. |
Типы данных массива | Каждый элемент массива записан, по крайней мере, однажды. |
Структурированные типы данных | Каждое поле структуры, которое используется, записано, по крайней мере, однажды. Если вы проверяете код инициализации только с помощью опции В особом случае, где ни одно из полей не используется, проверки на инициализацию являются оранжевыми вместо зеленого, если весь fields.are деинициализировал. |
Указатели | Указатель записан, по крайней мере, однажды. Однако Code Prover не проверяет на инициализацию резкого буфера (пока вы не разыменовываете указатель). |
Перечисления | enum переменная записана, по крайней мере, однажды. Однако Code Prover не проверяет, имеет ли переменная один из enum значения. |
Check that global variables are initialized after warm reboot (-check-globals-init)
| Verify initialization section of code only (-init-only-mode)
| Global variable not assigned a value in initialization code
| Non-initialized variable