diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-08-13 23:32:15 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-08-13 23:32:15 +0000 |
commit | e3b1d962185c72fddaf634dcd80d468c01c96e6d (patch) | |
tree | aaecf7f217bec319000ba751ee013102fdfd8da5 | |
parent | a7be375586bad56f4fc15da1fe1759deabef1ff6 (diff) | |
download | bcm5719-llvm-e3b1d962185c72fddaf634dcd80d468c01c96e6d.tar.gz bcm5719-llvm-e3b1d962185c72fddaf634dcd80d468c01c96e6d.zip |
[analyzer] Fix UninitializedObjectChecker to not crash on uninitialized "id" fields
Differential Revision: https://reviews.llvm.org/D50673
llvm-svn: 339631
3 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp index 4da5fa5461b..810e0661782 100644 --- a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp @@ -265,7 +265,7 @@ bool FindUninitializedFields::isNonUnionUninit(const TypedValueRegion *R, continue; } - if (T->isPointerType() || T->isReferenceType() || T->isBlockPointerType()) { + if (T->isAnyPointerType() || T->isReferenceType() || T->isBlockPointerType()) { if (isPointerOrReferenceUninit(FR, LocalChain)) ContainsUninitField = true; continue; diff --git a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp index 7f08d028942..6c83b2e146d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp @@ -78,7 +78,7 @@ static bool isVoidPointer(QualType T); bool FindUninitializedFields::isPointerOrReferenceUninit( const FieldRegion *FR, FieldChainInfo LocalChain) { - assert((FR->getDecl()->getType()->isPointerType() || + assert((FR->getDecl()->getType()->isAnyPointerType() || FR->getDecl()->getType()->isReferenceType() || FR->getDecl()->getType()->isBlockPointerType()) && "This method only checks pointer/reference objects!"); diff --git a/clang/test/Analysis/objcpp-uninitialized-object.mm b/clang/test/Analysis/objcpp-uninitialized-object.mm index 3ec1eb75182..c1afb726389 100644 --- a/clang/test/Analysis/objcpp-uninitialized-object.mm +++ b/clang/test/Analysis/objcpp-uninitialized-object.mm @@ -20,3 +20,13 @@ void warnOnUninitializedBlock() { void noWarningWhenInitialized() { StructWithBlock a; } + +struct StructWithId { + int a; + id z; // expected-note{{uninitialized pointer 'this->z'}} + StructWithId() : a(0) {} // expected-warning{{1 uninitialized field at the end of the constructor call}} +}; + +void warnOnUninitializedId() { + StructWithId s; +} |