Oracle Solaris Studio 12.2 Discover 和 Uncover 用户指南

快速入门

下例说明了如何准备程序、使用 Discover 对其进行校验、运行程序,以及针对检测到的内存访问错误生成一个报告。此示例使用了一个访问未初始化数据的简单程序。


% cat test_UMR.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
  //  UMR:  accessing uninitialized data
  int *p = (int*) malloc(sizeof(int));
  printf("*p = %d\n", *p);
  free(p);
}

% cc -g -02 test_UMR.c
% a.out
*p = 131464
% discover -w - a.out
% a.out
ERROR (UMR): accessing uninitialized data from address 0x50010 (4 bytes) at:
        main() + 0x54  <test_UMR.c:7>
                 4:    {
                 5:      //  UMR:  accessing uninitialized data
                 6:      int *p = (int*) malloc(sizeof(int)); 
                 7:=>    printf(**p = %d\n", *p);
                 8:      free(p);
                 9:    }
        _start() + 0x108
    block at 0x50010 (4 bytes long) was allocated at:
        malloc() + 0x220
        main() + 0x1c  <test_UMR.c:6>
                3:    int main()
                4:    {
                5:      //  UMR:  accessing uninitialized data
                6:=>    int *p = (int*) malloc(sizeof(int)); 
                7:      printf(**p = %d\n", *p);
                8:      free(p);
                9:    }
        _start() + 0x108
*p = 327704
**************** Discover Memory Report *****************
No allocated memory left on program exit.
DISCOVER SUMMARY:
        unique errors   : 1 (1 total, 0 filtered)
        unique warnings : 0 (0 total, 0 filtered)
FILTERS: type=ML:func=_rt_boot:depth=*; type=*:func__f90_esfw:depth=*;
type=ML:func=__f90_ssfw:depth=*; 

Discover 输出显示了在何处使用了未初始化内存、将其分配至了何处,以及结果摘要。