[cfe-dev] clang-tidy false positive cplusplus.NewDeleteLeaks

Tiago Macarios via cfe-dev cfe-dev at lists.llvm.org
Thu Dec 1 17:52:43 PST 2016


Hi,

First time poster so I hope I get the etiquette right.

I am trying to use clang-tidy (3.9.1) with a Qt (5.7) project and I am
getting a false positive memory leak.

Here is the CMake file:

cmake_minimum_required(VERSION 3.2)
project(main)
add_executable(main main.cpp)
set_target_properties(main
    PROPERTIES
    CXX_STANDARD 14
    CXX_EXTENSIONS OFF
    AUTOMOC ON
    AUTOUIC ON
    CXX_CLANG_TIDY
        "clang-tidy"
        "-checks=modernize-*,readability-*,performance-*"
        "-fix"
)
find_package(Qt5Core)
target_link_libraries(main Qt5::Core)



Here is the main.cpp (it is the minimum amount of code to reproduce the
issue, the code itself is brain-dead):

#include <QObject>

int main(int argc, char *argv[])
{
    QObject a;
    QObject::connect(&a, &QObject::destroyed, []() {});
    return 0;
}



clang-tidy will display the following warning:

/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:343:16: warning: Potential
memory leak [clang-analyzer-cplusplus.NewDeleteLeaks]
        return connectImpl(sender, reinterpret_cast<void **>(&signal),
context, Q_NULLPTR,
               ^
/mnt/e/_Working/tidy/main.cpp:8:5: note: Calling 'QObject::connect'
    QObject::connect(&a, &QObject::destroyed, []() {});
    ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:293:16: note: Calling
'QObject::connect'
        return connect(sender, signal, sender, slot, Qt::DirectConnection);
               ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:308:39: note: '?'
condition is true
        const int SlotArgumentCount = (FunctorArgumentCount >= 0) ?
FunctorArgumentCount : 0;
                                      ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:340:13: note: Left side of
'||' is false
        if (type == Qt::QueuedConnection || type ==
Qt::BlockingQueuedConnection)
            ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:340:9: note: Taking false
branch
        if (type == Qt::QueuedConnection || type ==
Qt::BlockingQueuedConnection)
        ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:344:28: note: Memory is
allocated
                           new QtPrivate::QFunctorSlotObject<Func2,
SlotArgumentCount,
                           ^
/opt/Qt5.7.0/5.7/gcc_64/include/QtCore/qobject.h:343:16: note: Potential
memory leak
        return connectImpl(sender, reinterpret_cast<void **>(&signal),
context, Q_NULLPTR,
               ^



Here is the code it refers to QtCore/qobject.h:343:

return connectImpl(sender, reinterpret_cast<void **>(&signal), context,
Q_NULLPTR,
                   new QtPrivate::QFunctorSlotObject<Func2,
SlotArgumentCount,
                        typename QtPrivate::List_Left<typename
SignalType::Arguments, SlotArgumentCount>::Value,
                        typename SignalType::ReturnType>(slot),
                   type, types, &SignalType::Object::staticMetaObject);



The object created by that new, does get properly destroyed. This seems to
happen at tCore\qobject_impl.h:168:

        static void impl(int which, QSlotObjectBase *this_, QObject *r,
void **a, bool *ret)
        {
            switch (which) {
            case Destroy:
                delete static_cast<QFunctorSlotObject*>(this_); //HERE
                break;
            case Call:
                FuncType::template call<Args,
R>(static_cast<QFunctorSlotObject*>(this_)->function, r, a);
                break;
            case Compare: // not implemented
            case NumOperations:
                Q_UNUSED(ret);
            }
        }



>From a naive perspective it seems like that false positive leak would be
pretty hard to catch. So I guess the best solution (at the moment) would be
for me to silence the error. (Please someone correct me if I am wrong).

Googling around I found two different ways to silence this false positives:
// NOLINT
#ifndef __clang_analyzer__

I tried to use both in multiple ways, see this SO post:
http://stackoverflow.com/questions/40642307/silencing-clang-tidy
But I still haven't figured out a way to silence this error. Maybe someone
can help me figure this one out?

FYI: QObject::connect is used all over Qt code. So I would rather patch the
Qt source files, then have to annotate every call to that function.

Mac.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161201/a774f9d6/attachment.html>


More information about the cfe-dev mailing list