Oracle Solaris Studio 12.2:C 用户指南

B.2.84 -xcheck[= o]

添加针对栈溢出的运行时检查并初始化局部变量。

可将 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 选项不进行累积。编译器按照上次出现的命令设置标志。

B.2.84.1 -xcheck=init_local 的初始化值

使用 -xcheck=init_local,编译器在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值:(注意这些值会发生更改,因此不应该依赖它们。)

基本类型

表 B–20 基本类型的 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 * 指针),将根据上表中所述的指针说明进行初始化。

永远不会初始化以下局部变量类型:限定的 constregister、计算的 goto 的标签号、局部标签、可变长度数组 (VLA)

初始化结构、联合和数组

struct 中作为基本类型的域将根据上表中所述进行初始化,union 中第一个声明的 pointerfloat 域也是如此。这样便最大程度地增加了未初始化引用生成可见错误的可能性。

数组元素也按上表所述进行初始化。

按如上所述对内嵌 structunion、数组域进行初始化,但以下情况除外:struct 包含位域,union 没有 pointerfloat 域,或者数组类型无法进行完整的初始化。将使用用于类型 double 的局部变量的值对它们进行初始化。不对可变长度组数进行初始化。