[analyzer][UninitializedObjectChecker] PR41741: Regard all scalar types as primitive.

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

Pretty much the same as D61246 and 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.

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

llvm-svn: 359998
This commit is contained in:
Kristof Umann 2019-05-05 19:42:33 +00:00
parent 02569408ef
commit aa9d2623a0
2 changed files with 36 additions and 8 deletions

View File

@ -323,9 +323,8 @@ private:
/// 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) {

View File

@ -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,28 @@ void __vector_size__LongTest() {
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;
// TODO: we should emit a warning for x2.x and x2.y.
ComplexUninitTest x2;
}