在某些cpp文件上的android服务上运行clang时出现问题。 我正在通过从中调用对象实例来创建故意的内存泄漏 另一个类而不删除它,以查看clang是否创建内存泄漏警告 是否,但在某些情况下,它不是在创建内存泄漏警告。
1-如果我将类声明与要创建内存泄漏的类放在同一头文件中,则clang会按以下方式捕获内存泄漏:
class Ad
{
public:
void xx();
};
class Example
{
public:
bool getData();
};
#include "Example.h"
void Ad::xx()
{
bool ar = false;
ar = true;
}
bool Example::getData()
{
char *ptrt;
ptrt = (char*)malloc(10*sizeof(char));
snprintf(ptrt,10,"%s","trial");
Ad *arr = new Ad();
arr->xx();
return true;
}
在此示例中,clang可以在getData()函数中捕获两次内存泄漏。
2-如果我在单独的头文件中创建类Ad声明,而不是clang无法捕获内存泄漏:
class Ad
{
public:
void xx();
};
#include "Ad.h"
void Ad::xx()
{
bool ar = false;
ar = true;
}
class Example
{
public:
bool getData();
};
#include "Example.h"
#include "Ad.h"
bool Example::getData()
{
Ad *arr = new Ad();
arr->xx();
//Clang can not catch memory leak error here..
return true;
}
Notes:
I am exporting WITH_STATIC_ANALYZER=1 on aosp android/ folder
and running mmma module_name/ .
I am using Android P for aosp.
I also initialized this flags in Android.bp
cflags:[
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
],
有什么想法可能会发生这种情况吗?
答案 0 :(得分:0)
我对clang的分析仪不太熟悉;但是我认为与第一种情况相比,第二种情况发生了两件事:
1)编译时,您要调用clang两次,创建2个目标文件,每个目标文件都有一个功能。因此,分析器数据无法从Ad::xx
传递到Example::getData
。
2)从Example.cpp clang调用的角度来看,没有任何东西可以保证Ad::xx
不会存储对其被调用的Ad
对象的引用,因此其生存期可以是比Example::getData
范围长。因此,没有内存泄漏警告。
尝试对两个实现使用相同的输入文件;应该可以使它起作用。