0

目前我正在使用 Valgrind 来检查内存泄漏并将 Purify 作为替代方案。Valgrind 可以找出在堆中创建但不在堆栈中创建的数组的访问冲突。

char* a = static_cast<char*>(malloc(sizeof(char) * 5));
a[7] = 'c';
printf("%c\n", a[7]);
free(a);

Valgrind 在上面的代码中指出了无效的读写,但在下面的代码中没有。

char a[5] = {0};
a[7] = 'c';
printf("%c\n", a[7]);  

Purify 能否识别出这两个代码块的访问冲突?

4

1 回答 1

0

根据用户指南 ( ftp://ftp.software.ibm.com/software/rational/docs/v2003/purify/html/ht_m_sbr.htm ) 和 ( ftp://ftp.software.ibm.com/software/ rational/docs/v2003/purify/html/ht_m_sbw.htm),Purify 可以检测堆栈边界读取和写入。

但是,在尝试您的实际示例时,Purify 也仅检测到了对堆数据的违规。我只测试了 IBM (7.0.1) 的最新版本,适用于 Linux 和 Solaris。

您可能想查看 gcc 4.8 及更高版本的 -fsanitize=address。

于 2016-12-09T12:10:04.377 回答