全局变量的初值——Ada应用实例之七
有一些帖子(如[1])讨论C语言中全局变量初值的问题。
在Ada语言中,除了访问类型的变量有默认的初始值NULL之外,其它任何类型的变量都没有默认的初始值。
各种操作系统在分配一个存储页面时采用不同的处理,有的把整个页面清0,有的则不作任何处理。因此,使用一个没有初始化过的变量的值,可能导致出错。
Ada提供了一个参数为Normalize_Scalars的编注(pragma),其功能是指示编译器对没有初值的纯量(scalar)变量赋予一个可预见的值,如果可能,这将是一个超出范围的值。
例如:
Pragma Normalize_Scalars;
My_Variable : Positive;
…
Some_Other_Variable := My_Variable;
上例第2行声明了一个类型为Positive的变量My_Variable,编译器将根据第1行给My_Variable赋予初值0,这是一个超出范围的数值。在执行最后一行赋值语句时,将引发异常。这样就可提醒开发者要正确设置My_Variable的初值。
这个编注的目的是消除对默认初值的依赖。许多UNIX环境的C编译/连接器提供了“DEAD BEEF”的选项,其功能是对没有初值的静态数据初始化为0xDEADBEEF,这对于整型、浮点型和字符型都是超出范围的。Normalize_Scalars可以说是“DEAD BEEF”的一个高级版本。
Ada95和Ada2005标准在附录H“Safety and Security”中定义编注Normalize_Scalars,这就是说,标准认为这是提高软件安全性的一个措施。