有时,当装入的结果对某些程序路径无效时,编译器会从已知的内存地址生成装入。这种情况经常发生在 SPARC 平台上,因为此类装入指令可以放置在分支指令的延迟槽中。下面提供了一个示例代码片段:
int i' if (foo(&i) != 0) { /* foo returns nonzero if it has initialized i */ printf("5d\n", i); } |
根据此代码,编译器可能会生成如下代码:
int i; int t1, t2' t1 = foo(&i); t2 = i; /* value in i is loaded */ if (t1 != 0) { printf("%d\n", t2); } |
假定本例中的函数 foo() 返回了 0 且未初始化 i。仍会从 i 生成装入,尽管它并未使用。但是,Discover 将会发现该装入,并报告装入了未初始化变量 (UMR)。
Discover 尽量使用数据流分析来识别此类情况,但有时无法检测到此类情况。
使用较低的优化级别进行编译可以减少这些类型的误报的发生。