lang语分析器缺少内存泄漏

时间:2019-04-25 08:07:50

标签: android c++ memory-leaks clang-static-analyzer

在某些cpp文件上的android服务上运行clang时出现问题。 我正在通过从中调用对象实例来创建故意的内存泄漏 另一个类而不删除它,以查看clang是否创建内存泄漏警告 是否,但在某些情况下,它不是在创建内存泄漏警告。

1-如果我将类声明与要创建内存泄漏的类放在同一头文件中,则clang会按以下方式捕获内存泄漏:

Example.h

 class Ad
 {
    public:
    void xx();
 };

 class Example
 {
    public:
    bool getData();
 };

Example.cpp

#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无法捕获内存泄漏:

Ad.h

class Ad
{
    public:
        void xx();
};

Ad.cpp

#include "Ad.h"

void Ad::xx()
{
    bool ar = false;
    ar = true;
}

Example.h

class Example
{
    public:
        bool getData();
};

Example.cpp

 #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",
    ],

有什么想法可能会发生这种情况吗?

1 个答案:

答案 0 :(得分:0)

我对clang的分析仪不太熟悉;但是我认为与第一种情况相比,第二种情况发生了两件事:

1)编译时,您要调用clang两次,创建2个目标文件,每个目标文件都有一个功能。因此,分析器数据无法从Ad::xx传递到Example::getData

2)从Example.cpp clang调用的角度来看,没有任何东西可以保证Ad::xx不会存储对其被调用的Ad对象的引用,因此其生存期可以是比Example::getData范围长。因此,没有内存泄漏警告。

尝试对两个实现使用相同的输入文件;应该可以使它起作用。