forked from OSchip/llvm-project
[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:
parent
b86448c669
commit
85c9211043
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue