目前我正在使用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可以识别两个代码块的访问冲突吗?
答案 0 :(得分: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。