summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-08-13 23:32:15 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-08-13 23:32:15 +0000
commite3b1d962185c72fddaf634dcd80d468c01c96e6d (patch)
treeaaecf7f217bec319000ba751ee013102fdfd8da5
parenta7be375586bad56f4fc15da1fe1759deabef1ff6 (diff)
downloadbcm5719-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
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp2
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp2
-rw-r--r--clang/test/Analysis/objcpp-uninitialized-object.mm10
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;
+}
OpenPOWER on IntegriCloud