可将 o 替换成下列值之一:
表 B–19 -xcheck 标志
标志 |
含义 |
---|---|
%none |
不执行任何 -xcheck 检查。 |
%all |
执行全部 -xcheck 检查。 |
stkovf |
启用栈溢出检查。-xcheck=stkovf 将添加针对单线程程序中的主线程以及多线程程序中的从属线程栈的栈溢出运行时检查。如果检测到栈溢出,则生成 SIGSEGV。如果您的应用程序需要以不同于处理其他地址空间违规的方式处理栈溢出导致的 SIGSEGV,请参见 sigaltstack(2)。 |
no%stkovf |
关闭栈溢出检查。 |
init_local |
初始化局部变量。有关详细信息,请参见以下介绍。 |
no%init_local |
不初始化局部变量。 |
如果未指定 -xcheck,则编译器缺省使用 -xcheck=%none。如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%all。
在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。
使用 -xcheck=init_local,编译器在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值:(注意这些值会发生更改,因此不应该依赖它们。)
类型 |
初始化值 |
---|---|
Char, __Bool |
0x85 |
short |
0x8001 |
int, long, enum (-m32) |
0xff80002b |
long (-m64) |
0xfff00031ff800033 |
long long |
0xfff00031ff800033 |
pointer |
0x00000001 (-m32) 0x0000000000000001 (-m64) |
float, float _Imaginary |
0xff800001 |
float _Complex |
0xff80000fff800011 |
double |
SPARC: 0xfff00003ff800005 x86: 0xfff00005ff800003 |
double _Imaginary |
0xfff00013ff800015 |
long double, long double _Imaginary |
SPARC: 0xffff0007ff800009 / 0xfff0000bff80000d x86: 12 bytes (-m32): 0x80000009ff800005 / 0x0000ffff x86 - 16 bytes (-m64): 0x80000009ff800005 / 0x0000ffff00000000 |
double _Complex |
0xfff00013ff800015 / 0xfff00017ff800019 |
long double _Complex |
SPARC: 0xffff001bff80001d / 0xfff0001fff800021 / 0xffff0023ff800025 / 0xfff00027ff800029 x86 - 12 bytes (-m32): 0x7fffb01bff80001d / 0x00007fff / 0x7fffb023ff800025 / 0x00007fff x86 - 16 bytes (-m64): 0x00007fff00080000 / 0x1b1d1f2100000000 / 0x00007fff00080000 / 0x2927252300000000 |
注意,为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中所述的指针说明进行初始化。
永远不会初始化以下局部变量类型:限定的 const、register、计算的 goto 的标签号、局部标签、可变长度数组 (VLA)
struct 中作为基本类型的域将根据上表中所述进行初始化,union 中第一个声明的 pointer 或 float 域也是如此。这样便最大程度地增加了未初始化引用生成可见错误的可能性。
数组元素也按上表所述进行初始化。
按如上所述对内嵌 struct、union、数组域进行初始化,但以下情况除外:struct 包含位域,union 没有 pointer 或 float 域,或者数组类型无法进行完整的初始化。将使用用于类型 double 的局部变量的值对它们进行初始化。不对可变长度组数进行初始化。