-qcheck
适用的调用
选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
---|---|---|---|---|
-qcheck | ✓ | ✓ | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
xlc/xlC 和其他遗留的调用命令 | xlclang/xlclang + + 调用命令 |
---|---|
#pragma 选项 [否] 检查 | 无 |
用途
生成用于执行某些类型的运行时检查的代码。
如果迂到违例,那么将通过向进程发送 SIGTRAP 信号来引发运行时错误。 请注意,运行时检查可能会导致应用程序执行较慢。
语法
缺省值
-qnocheck
参数
- all
- 启用所有子选项。
- bounds | nobounds
- 在已知大小的对象中执行地址预订的运行时检查。 检查索引以确保它将产生位于对象存储器的边界内的地址。 如果地址不在对象的边界内,那么将发生陷阱。
此子选项不会影响对可变长度数组的访问。
- divzero | nodivzero
- 执行整数除法的运行时检查。 如果试图将零作为除数,那么将捕获异常。
- nullptr | nonullptr
- 对用于引用存储器的指针变量中包含的地址执行运行时检查。 在使用点检查地址; 如果值小于 512 ,将发生陷阱。
- stackclobber | nostackclobber
- 在用户程序中检测保存区域中非易失性寄存器的堆栈损坏。 仅当
对堆栈的保存区域中的
任何非易失寄
存器进行修改时,才会
发生此类型的溢出。
如果 -qstackprotect 选项和这个子选项都打开,这个子选项会首先检测堆栈损坏。
- unset | nounset
- 检查在设置自动变量之前是否使用了这些自动变量。 如果在使用自动变量之前未设置该自动变量,那么在运行时将发生陷阱。
-qinitauto 选项用于初始化自动变量。 因此,-qinitauto 选项会对 -qcheck=unset 选项隐藏未初始化的变量。
指定不带子选项的 -qcheck 选项等同于指定 -qcheck=all。
使用量
您可以多次指定 -qcheck 选项。 子选项设置是累积的,但后面的子选项会覆盖前面的子选项。
您可以将 all 子选项与 no ... 一起使用 作为过滤器的一个或多个其他选项的格式。 例如,使用:
xlc myprogram.c -qcheck=all:nonullptr
提供除用于引用存储器的指针变量中包含的地址以外的所有内容的检查。 如果将 all 与 no ... 配合使用 子选项的格式, all 应该是第一个子选项。预定义的宏
无。
示例
以下代码示例显示了 -qcheck=nullptr:bounds的效果:
void func1(int* p) {
*p = 42; /* Traps if p is a null pointer */
}
void func2(int i) {
int array[10];
array[i] = 42; /* Traps if i is outside range 0 - 9 */
}
以下代码示例显示了 -qcheck=divzero的效果:
void func3(int a, int b) {
a / b; /* Traps if b=0 */
}
以下代码示例显示了 -qcheck=stackclobber的效果:
void func4(char *p, int off, int value) {
*(p+off)=value;
}
int foo() {
int i;
char boo[9];
i=24;
func4(boo, i, 66);
/* Traps here */
return 0;
}
int main() {
foo();
}
注: 偏移量可能会在不同优化级别发生更改。 当 -O2 或更低的优化级别生效时,
func4
将关闭 foo
的保存区域,因为 *(p+off)
位于保存区域中。在函数
factorial
中, result
在 n<=1
时未初始化。 要检测 factorial.c
中未初始化的变量,请输入以下命令:xlc -g -O -qcheck=unset factorial.c
factorial.c
包含以下代码:int factorial(int n) {
int result;
if (n > 1) {
result = n * factorial(n - 1);
}
return result; /* line 8 */
}
int main() {
int x = factorial(1);
return x;
}
编译器在编译时发出以下参考消息,并且在运行时第 8 行出现陷阱:1500-099: (I) "factorial.c", line 8: "result" might be used before it is set.
注: 如果在 noopt设置 -qcheck=unset ,那么编译器不会在编译时发出参考消息。