Szelethus created this revision.
Szelethus added reviewers: NoQ, dcoughlin, baloghadamsoftware, gribozavr, 
xazax.hun, rnkovacs, Charusso, a_sidorin.
Szelethus added a project: clang.
Herald added subscribers: cfe-commits, gamesh411, dkrupp, donat.nagy, 
mikhail.ramalho, a.sidorin, szepet, whisperity.

https://bugs.llvm.org/show_bug.cgi?id=41741

Pretty much the same as D61246 <https://reviews.llvm.org/D61246> and D61106 
<https://reviews.llvm.org/D61106>, this time for `__complex__` types. Upon 
further investigation, I realized that we should regard all types 
`Type::isScalarType` returns true for as primitive, so I merged  
`isMemberPointerType(), `isBlockPointerType()` and `isAnyComplexType()` into 
that instead.

I also stumbled across yet another bug, 
https://bugs.llvm.org/show_bug.cgi?id=41753, but it seems to be unrelated to 
this checker.


Repository:
  rC Clang

https://reviews.llvm.org/D61569

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


Index: test/Analysis/cxx-uninitialized-object.cpp
===================================================================
--- test/Analysis/cxx-uninitialized-object.cpp
+++ test/Analysis/cxx-uninitialized-object.cpp
@@ -1,11 +1,15 @@
-// RUN: %clang_analyze_cc1 
-analyzer-checker=core,optin.cplusplus.UninitializedObject \
+// RUN: %clang_analyze_cc1 -std=c++14 -verify  %s \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-checker=optin.cplusplus.UninitializedObject \
 // RUN:   -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true 
-DPEDANTIC \
-// RUN:   -analyzer-config 
optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true \
-// RUN:   -std=c++14 -verify  %s
+// RUN:   -analyzer-config \
+// RUN:     optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true
 
-// RUN: %clang_analyze_cc1 
-analyzer-checker=core,optin.cplusplus.UninitializedObject \
-// RUN:   -analyzer-config 
optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true \
-// RUN:   -std=c++14 -verify  %s
+// RUN: %clang_analyze_cc1 -std=c++14 -verify  %s \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-checker=optin.cplusplus.UninitializedObject \
+// RUN:   -analyzer-config \
+// RUN:     optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true
 
 
//===----------------------------------------------------------------------===//
 // Default constructor test.
@@ -1156,3 +1160,26 @@
   VectorSizeLong v;
   v.x[0] = 0;
 }
+
+struct ComplexUninitTest {
+  ComplexUninitTest() {}
+  __complex__ float x;
+  __complex__ int y;
+};
+
+// FIXME: Currently this causes (unrelated to this checker) an assertion
+// failure.
+//
+//struct ComplexInitTest {
+//  ComplexInitTest() {
+//    x = {1.0f, 1.0f};
+//    y = {1, 1};
+//  }
+//  __complex__ float x;
+//  __complex__ int y;
+//};
+
+void fComplexTest() {
+//  ComplexInitTest x;
+  ComplexUninitTest x2;
+}
Index: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
===================================================================
--- lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
+++ lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
@@ -323,9 +323,8 @@
 /// needs to be analyzed as much as checking whether their value is undefined.
 inline bool isPrimitiveType(const QualType &T) {
   return T->isBuiltinType() || T->isEnumeralType() ||
-         T->isMemberPointerType() || T->isBlockPointerType() ||
          T->isFunctionType() || T->isAtomicType() ||
-         T->isVectorType();
+         T->isVectorType() || T->isScalarType();
 }
 
 inline bool isDereferencableType(const QualType &T) {


Index: test/Analysis/cxx-uninitialized-object.cpp
===================================================================
--- test/Analysis/cxx-uninitialized-object.cpp
+++ test/Analysis/cxx-uninitialized-object.cpp
@@ -1,11 +1,15 @@
-// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \
+// RUN: %clang_analyze_cc1 -std=c++14 -verify  %s \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-checker=optin.cplusplus.UninitializedObject \
 // RUN:   -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \
-// RUN:   -analyzer-config optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true \
-// RUN:   -std=c++14 -verify  %s
+// RUN:   -analyzer-config \
+// RUN:     optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true
 
-// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \
-// RUN:   -analyzer-config optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true \
-// RUN:   -std=c++14 -verify  %s
+// RUN: %clang_analyze_cc1 -std=c++14 -verify  %s \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-checker=optin.cplusplus.UninitializedObject \
+// RUN:   -analyzer-config \
+// RUN:     optin.cplusplus.UninitializedObject:CheckPointeeInitialization=true
 
 //===----------------------------------------------------------------------===//
 // Default constructor test.
@@ -1156,3 +1160,26 @@
   VectorSizeLong v;
   v.x[0] = 0;
 }
+
+struct ComplexUninitTest {
+  ComplexUninitTest() {}
+  __complex__ float x;
+  __complex__ int y;
+};
+
+// FIXME: Currently this causes (unrelated to this checker) an assertion
+// failure.
+//
+//struct ComplexInitTest {
+//  ComplexInitTest() {
+//    x = {1.0f, 1.0f};
+//    y = {1, 1};
+//  }
+//  __complex__ float x;
+//  __complex__ int y;
+//};
+
+void fComplexTest() {
+//  ComplexInitTest x;
+  ComplexUninitTest x2;
+}
Index: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
===================================================================
--- lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
+++ lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h
@@ -323,9 +323,8 @@
 /// needs to be analyzed as much as checking whether their value is undefined.
 inline bool isPrimitiveType(const QualType &T) {
   return T->isBuiltinType() || T->isEnumeralType() ||
-         T->isMemberPointerType() || T->isBlockPointerType() ||
          T->isFunctionType() || T->isAtomicType() ||
-         T->isVectorType();
+         T->isVectorType() || T->isScalarType();
 }
 
 inline bool isDereferencableType(const QualType &T) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to