Oracle® Solaris Studio 12.4:Fortran 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

3.4.114 –xcheck[=keyword[,keyword]]

生成特殊的运行时检查和初始化。

keyword 必须是以下项之一:

keyword
特性
stkovf[action]
生成代码以便在运行时检测堆栈溢出错误,可以选择指定检测到堆栈溢出错误时要执行的操作。
当设置的线程堆栈指针超过为线程分配的堆栈边界时,便会出现堆栈溢出错误。如果堆栈地址的新顶端可写入,则无法检测到错误。
如果内存访问违规作为错误的直接结果发生,从而发出关联信号(通常是 SIGSEGV),则会检测到堆栈溢出错误。我们说由此发出的信号与错误关联。
如果指定了 -xcheck=stkovf[action],当堆栈帧大于系统页面大小时,编译器会生成代码来检测堆栈溢出错误。代码包括库调用以强制内存访问违规而非将堆栈指针设置为无效但有可能映射的地址(请参见 _stack_grow(3C))。
如果指定,可选的 action 必须为 :detect:diagnose
如果 action:detect,则通过执行通常与错误关联的信号处理程序来处理检测到的堆栈溢出错误。
如果 action:diagnose,则通过捕获关联信号并调用 stack_violation(3C) 诊断错误来处理检测到的堆栈溢出错误。这是没有指定action时的缺省行为。
如果内存访问违规诊断为堆栈溢出错误,则会将以下消息打印到 stderr
ERROR: stack overflow detected: pc=<inst_addr>, sp=<sp_addr>
其中 <inst_addr> 是在其中检测到错误的指令的地址,<sp_addr> 是检测到错误时堆栈指针的值。检查堆栈溢出并打印以上消息(如果适用)后,控制能力传递给通常与错误关联的信号处理程序。
-xcheck=stkovf:detect 可将进入时的堆栈边界检查添加到堆栈帧大于系统页面大小的例程(请参见 _stack_grow(3C))。在大多数应用程序中,额外边界检查的相对成本应该微乎其微。
-xcheck=stkovf:diagnose 可将系统调用添加到线程创建(请参见 sigaltstack(2))。额外系统调用的相对成本取决于应用程序创建和销毁新线程的频率。
-xcheck=stkovf 仅在 Oracle Solaris 上受支持。Linux 上的 C 运行时库不支持堆栈溢出检测。
no%stkovf
禁用用于检测堆栈溢出的运行时检查。
init_local
执行特殊的本地变量初始化。
编译器将局部变量初始化为这样一个值:如果在赋予该值之前程序使用了它,则可能会导致运算异常。由 ALLOCATE 语句分配的内存也会以这种方式初始化。
不对模块变量、STATICSAVE 本地变量及 COMMON 块中的变量进行初始化。
有关详细信息,请参见《C 用户指南》。
no%init_local
禁用局部变量初始化。这是缺省值。
%all
打开所有这些运行时检查功能。
%none
禁用所有这些运行时检查功能。

堆栈溢出(尤其是在堆栈上分配大数组的多线程应用程序中)可能会在邻近线程堆栈中导致无提示的数据损坏。如果怀疑存在堆栈溢出,请使用 -xcheck=stkovf 编译所有例程。但请注意,使用此标志进行编译不保证将检测到所有堆栈溢出情况,因为它们可能出现在不是使用此标志编译的例程中。