diff options
author | Kristof Umann <kristof.umann@ericsson.com> | 2019-04-30 08:47:56 +0000 |
---|---|---|
committer | Kristof Umann <kristof.umann@ericsson.com> | 2019-04-30 08:47:56 +0000 |
commit | bbce6781086684deafc9a99d1f9bc6783aa70787 (patch) | |
tree | 867afc3ed5232b95cfb4dec5cb5b754ba6c10a75 | |
parent | c208eda5d902a10fcbc85024a06a60f72fbed767 (diff) |
[analyzer][UninitializedObjectChecker] PR41611: Regard vector types as primitive
https://bugs.llvm.org/show_bug.cgi?id=41611
Similarly to D61106, the checker ran over an llvm_unreachable for vector types:
struct VectorSizeLong {
VectorSizeLong() {}
__attribute__((__vector_size__(16))) long x;
};
void __vector_size__LongTest() {
VectorSizeLong v;
}
Since, according to my short research,
"The vector_size attribute is only applicable to integral and float scalars,
although arrays, pointers, and function return values are allowed in conjunction
with this construct."
[src: https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Vector-Extensions.html#Vector-Extensions]
vector types are safe to regard as primitive.
Differential Revision: https://reviews.llvm.org/D61246
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359539 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h | 3 | ||||
-rw-r--r-- | test/Analysis/cxx-uninitialized-object-ptr-ref.cpp | 23 | ||||
-rw-r--r-- | test/Analysis/cxx-uninitialized-object.cpp | 15 |
3 files changed, 38 insertions, 3 deletions
diff --git a/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h b/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h index a0d3e56b1c..3f33443f98 100644 --- a/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h +++ b/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h @@ -324,7 +324,8 @@ private: inline bool isPrimitiveType(const QualType &T) { return T->isBuiltinType() || T->isEnumeralType() || T->isMemberPointerType() || T->isBlockPointerType() || - T->isFunctionType() || T->isAtomicType(); + T->isFunctionType() || T->isAtomicType() || + T->isVectorType(); } inline bool isDereferencableType(const QualType &T) { diff --git a/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp b/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp index 4f737fa31b..5363831342 100644 --- a/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp +++ b/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp @@ -256,6 +256,29 @@ void fCharPointerTest() { CharPointerTest(); } +struct VectorSizePointer { + VectorSizePointer() {} // expected-warning{{1 uninitialized field}} + __attribute__((__vector_size__(8))) int *x; // expected-note{{uninitialized pointer 'this->x'}} + int dontGetFilteredByNonPedanticMode = 0; +}; + +void __vector_size__PointerTest() { + VectorSizePointer v; +} + +struct VectorSizePointee { + using MyVectorType = __attribute__((__vector_size__(8))) int; + MyVectorType *x; + + VectorSizePointee(decltype(x) x) : x(x) {} +}; + +void __vector_size__PointeeTest() { + VectorSizePointee::MyVectorType i; + // TODO: Report v.x's pointee. + VectorSizePointee v(&i); +} + struct CyclicPointerTest1 { int *ptr; // expected-note{{object references itself 'this->ptr'}} int dontGetFilteredByNonPedanticMode = 0; diff --git a/test/Analysis/cxx-uninitialized-object.cpp b/test/Analysis/cxx-uninitialized-object.cpp index 86f2ecdd83..a811319854 100644 --- a/test/Analysis/cxx-uninitialized-object.cpp +++ b/test/Analysis/cxx-uninitialized-object.cpp @@ -1132,7 +1132,7 @@ void fCXX11MemberInitTest2() { } //===----------------------------------------------------------------------===// -// _Atomic tests. +// "Esoteric" primitive type tests. //===----------------------------------------------------------------------===// struct MyAtomicInt { @@ -1142,6 +1142,17 @@ struct MyAtomicInt { MyAtomicInt() {} // expected-warning{{1 uninitialized field}} }; -void entry() { +void _AtomicTest() { MyAtomicInt b; } + +struct VectorSizeLong { + VectorSizeLong() {} + __attribute__((__vector_size__(16))) long x; +}; + +void __vector_size__LongTest() { + // TODO: Warn for v.x. + VectorSizeLong v; + v.x[0] = 0; +} |