[analyzer] Add another exception for Qt in MallocChecker

Treat pointers passed to QObject::connectImpl() as escaping.

rdar://problem/29550440

Differential Revision: https://reviews.llvm.org/D27717

llvm-svn: 289939
This commit is contained in:
Artem Dergachev 2016-12-16 12:21:55 +00:00
parent b86448c669
commit 85c9211043
3 changed files with 29 additions and 1 deletions

View File

@ -2579,6 +2579,11 @@ bool MallocChecker::mayFreeAnyEscapedMemoryOrIsModeledExplicitly(
return true;
}
if (FName == "connectImpl" &&
FD->getQualifiedNameAsString() == "QObject::connectImpl") {
return true;
}
// Handle cases where we know a buffer's /address/ can escape.
// Note that the above checks handle some special cases where we know that
// even though the address escapes, it's still our responsibility to free the

View File

@ -1,6 +1,23 @@
#pragma clang system_header
namespace QtPrivate {
struct QSlotObjectBase {};
}
namespace Qt {
enum ConnectionType {};
}
struct QMetaObject {
struct Connection {};
};
struct QObject {
static QMetaObject::Connection connectImpl(const QObject *, void **,
const QObject *, void **,
QtPrivate::QSlotObjectBase *,
Qt::ConnectionType,
const int *, const QMetaObject *);
};
struct QEvent {

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc,cplusplus -analyzer-store=region -verify %s
// RUN: %clang_cc1 -std=c++11 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc,cplusplus -analyzer-store=region -verify %s
// expected-no-diagnostics
#include "Inputs/qt-simulator.h"
@ -13,3 +13,9 @@ void send(QObject *obj)
QEvent *e4 = new QEvent(QEvent::None);
QApplication::postEvent(obj, e4);
}
void connect(QObject *obj) {
obj->connectImpl(nullptr, nullptr, nullptr, nullptr,
new QtPrivate::QSlotObjectBase(), (Qt::ConnectionType)0,
nullptr, nullptr);
}