Clang анализатор отсутствует утечки памяти - PullRequest
0 голосов
/ 25 апреля 2019

У меня проблема при запуске clang в службе Android для какого-либо файла cpp. Я создаю преднамеренную утечку памяти, вызывая экземпляр объекта из другой класс, не удаляя его, чтобы увидеть, создает ли 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 может отловить 2 утечки памяти в функции 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 голосов
/ 25 апреля 2019

Я не очень знаком с анализатором Clang;однако я думаю, что во втором случае происходит 2 вещи по сравнению с первым:

1) При компиляции вы дважды вызываете clang, создавая 2 объектных файла, каждый с одной из функций.Следовательно, данные анализатора не могут проходить от Ad::xx до Example::getData.

2) С точки зрения вызова clang Example.cpp, ничто не гарантирует, что Ad::xx не сохранит ссылку на Ad объект, для которого он вызывается, таким образом, его время жизни может быть больше, чем область действия Example::getData.Следовательно, нет предупреждения об утечке памяти.

Попробуйте использовать один и тот же входной файл для обеих реализаций;это должно заставить его работать.

...