[analyzer] Fix an infinite recursion bug while checking parent methods in RetainCountChecker
Differential Revision: https://reviews.llvm.org/D55351 llvm-svn: 348531
This commit is contained in:
parent
b7156fb504
commit
a71ec6c00a
@ -730,7 +730,7 @@ bool applyFunctionParamAnnotationEffect(const ParmVarDecl *pd,
|
||||
if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
|
||||
for (const auto *OD : MD->overridden_methods()) {
|
||||
const ParmVarDecl *OP = OD->parameters()[parm_idx];
|
||||
if (applyFunctionParamAnnotationEffect(OP, parm_idx, MD, AF, Template))
|
||||
if (applyFunctionParamAnnotationEffect(OP, parm_idx, OD, AF, Template))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,6 +45,8 @@ struct OSArray : public OSObject {
|
||||
|
||||
OSObject *identity() override;
|
||||
|
||||
virtual OSObject *generateObject(OSObject *input);
|
||||
|
||||
virtual void consumeReference(OS_CONSUME OSArray *other);
|
||||
|
||||
static OSArray *generateArrayHasCode() {
|
||||
@ -68,6 +70,8 @@ struct MyArray : public OSArray {
|
||||
void consumeReference(OSArray *other) override;
|
||||
|
||||
OSObject *identity() override;
|
||||
|
||||
OSObject *generateObject(OSObject *input) override;
|
||||
};
|
||||
|
||||
struct OtherStruct {
|
||||
@ -79,6 +83,14 @@ struct OSMetaClassBase {
|
||||
static OSObject *safeMetaCast(const OSObject *inst, const OSMetaClass *meta);
|
||||
};
|
||||
|
||||
void test_no_infinite_check_recursion(MyArray *arr) {
|
||||
OSObject *input = new OSObject;
|
||||
OSObject *o = arr->generateObject(input);
|
||||
o->release();
|
||||
input->release();
|
||||
}
|
||||
|
||||
|
||||
void check_param_attribute_propagation(MyArray *parent) {
|
||||
OSArray *arr = new OSArray;
|
||||
parent->consumeReference(arr);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user