]> granicus.if.org Git - clang/commitdiff
[analyzer][UninitializedObjectChecker] PR41590: Regard _Atomic types as primitive
authorKristof Umann <kristof.umann@ericsson.com>
Thu, 25 Apr 2019 20:00:51 +0000 (20:00 +0000)
committerKristof Umann <kristof.umann@ericsson.com>
Thu, 25 Apr 2019 20:00:51 +0000 (20:00 +0000)
https://bugs.llvm.org/show_bug.cgi?id=41590

For the following code snippet, UninitializedObjectChecker crashed:

struct MyAtomicInt {
  _Atomic(int) x;
  MyAtomicInt() {}
};

void entry() {
  MyAtomicInt b;
}

The problem was that _Atomic types were not regular records, unions,
dereferencable or primitive, making the checker hit the llvm_unreachable at
lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp:347.
The solution is to regard these types as primitive as well. The test case shows
that with this addition, not only are we able to get rid of the crash, but we
can identify x as uninitialized.

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359230 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
test/Analysis/cxx-uninitialized-object.cpp

index 3c2c5c453c429ceead454452030d38341c8118fa..a0d3e56b1ceec3e19f78d21c2392f925600031d3 100644 (file)
@@ -324,7 +324,7 @@ private:
 inline bool isPrimitiveType(const QualType &T) {
   return T->isBuiltinType() || T->isEnumeralType() ||
          T->isMemberPointerType() || T->isBlockPointerType() ||
-         T->isFunctionType();
+         T->isFunctionType() || T->isAtomicType();
 }
 
 inline bool isDereferencableType(const QualType &T) {
index bcd3d85d0fd04da368f6d733db0f1395a98d9315..86f2ecdd83a84c62f404eae4350b3eefca45b39e 100644 (file)
@@ -1130,3 +1130,18 @@ void fCXX11MemberInitTest2() {
   // TODO: we'd expect the warning: {{2 uninitializeds field}}
   CXX11MemberInitTest2(); // no-warning
 }
+
+//===----------------------------------------------------------------------===//
+// _Atomic tests.
+//===----------------------------------------------------------------------===//
+
+struct MyAtomicInt {
+  _Atomic(int) x; // expected-note{{uninitialized field 'this->x'}}
+  int dontGetFilteredByNonPedanticMode = 0;
+
+  MyAtomicInt() {} // expected-warning{{1 uninitialized field}}
+};
+
+void entry() {
+  MyAtomicInt b;
+}