Oracle® Developer Studio 12.5:Discover 和 Uncover 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

使用 discover 时的限制

本节介绍在使用 discover 时的一些已知限制。

无注释代码可能导致错误结果

discover 实用程序只能检测检测二进制文件中已介绍的代码。未检测的代码可能来自链接到二进制文件的汇编语言代码,或者来自使用早于该部分中所列版本的编译器或操作系统编译的模块。如果未检测某个函数,可能会针对该函数、其调用方或被调用方发出误报错误消息。此外,某些错误可能没有在未检测的函数中诊断出来。

discover 实用程序无法检测汇编语言模块或包含 asm 语句或 .il 模板的函数。

此外,Oracle Developer Studio 12.5 C++ 运行时库不包含注释数据,因为它们未使用 Oracle Developer Studio 编译器进行编译。

计算机指令可能不同于源代码

discover 处理的是计算机代码。该工具可检测到装入和存储等计算机指令中的错误,并将这些错误与源代码相关联。由于某些源代码语句没有关联的计算机指令,因此 discover 似乎无法检测到明显的用户错误。例如,请看以下 C 语言代码片段:

int *p = (int *)malloc(sizeof(int));
int i;

i = *p;  /* compiler may not generate code for this statement */
printf("Hello World!\n");

return;

由于内存未初始化,读取 p 所指向的地址处存储的值就是一个潜在的用户错误。但是,优化编译器可以检测到未使用变量 i,因此不会生成让语句读取内存并将其分配给 i 的代码。在此情况下,discover 不会报告使用了未初始化内存 (UMR)。

编译器选项影响生成的代码

编译器生成的代码是不可预测的。由于编译器生成的代码会因所使用的编译器选项(包括 –On 优化选项)的不同而异,因此,discover 报告的错误也可能有所不同。例如,在 –O1 优化级别上生成的代码中报告的错误可能不适用于在 –O4 优化级别上生成的代码。

使用 –xlinkopt 标志编译的二进制文件与 discover 不兼容。

系统库可能会影响报告的错误

系统库是随操作系统一起预装的,无法重新编译以进行检测。discover 实用程序为标准 C 库 (libc.so) 中的公用函数提供支持;也就是说,discover 知道这些函数访问或修改的内存。但是,如果应用程序使用了其他系统库,可能会在 discover 报告中出现误报。如果出现误报,可以从代码调用 discover API 来消除误报。

定制内存管理可能会影响数据的准确性

discover 实用程序可以跟踪标准编程语言机制(如 malloc()calloc()free()operator new()operator delete())分配的堆内存。

如果应用程序使用具有标准函数的定制内存管理系统(例如,使用 malloc() 实现的池分配管理),则 discover 可能无法保证正确报告泄漏或对已释放内存的访问。

    discover 实用程序不支持下列内存分配器:

  • 直接使用 brk(2)()sbrk(2)() 系统调用的定制堆分配器

  • 静态链接到二进制文件中的标准堆管理函数

  • 使用 mmap(2)()shmget(2)() 系统调用从用户代码中分配的内存

不支持 signaltstack(2)() 函数。