r348605 - [CTU] Add more lit tests and better error handling
Gabor Marton via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 7 08:05:58 PST 2018
Author: martong
Date: Fri Dec 7 08:05:58 2018
New Revision: 348605
URL: http://llvm.org/viewvc/llvm-project?rev=348605&view=rev
Log:
[CTU] Add more lit tests and better error handling
Summary:
Adding some more CTU list tests. E.g. to check if a construct is unsupported.
We also slightly modify the handling of the return value of the `Import`
function from ASTImporter.
Reviewers: xazax.hun, balazske, a_sidorin
Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits
Differential Revision: https://reviews.llvm.org/D55131
Added:
cfe/trunk/test/Analysis/Inputs/ctu-other.c
cfe/trunk/test/Analysis/Inputs/ctu-other.c.externalFnMap.txt
cfe/trunk/test/Analysis/Inputs/ctu-other.cpp.externalFnMap.txt
- copied, changed from r348594, cfe/trunk/test/Analysis/Inputs/externalFnMap.txt
cfe/trunk/test/Analysis/ctu-main.c
Removed:
cfe/trunk/test/Analysis/Inputs/externalFnMap.txt
Modified:
cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp
cfe/trunk/test/Analysis/ctu-main.cpp
Modified: cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp?rev=348605&r1=348604&r2=348605&view=diff
==============================================================================
--- cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp (original)
+++ cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp Fri Dec 7 08:05:58 2018
@@ -269,7 +269,9 @@ CrossTranslationUnitContext::importDefin
ASTImporter &Importer = getOrCreateASTImporter(FD->getASTContext());
auto *ToDecl =
- cast<FunctionDecl>(Importer.Import(const_cast<FunctionDecl *>(FD)));
+ cast_or_null<FunctionDecl>(Importer.Import(const_cast<FunctionDecl *>(FD)));
+ if (!ToDecl)
+ return llvm::make_error<IndexError>(index_error_code::failed_import);
assert(ToDecl->hasBody());
assert(FD->hasBody() && "Functions already imported should have body.");
++NumGetCTUSuccess;
Added: cfe/trunk/test/Analysis/Inputs/ctu-other.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/ctu-other.c?rev=348605&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/Inputs/ctu-other.c (added)
+++ cfe/trunk/test/Analysis/Inputs/ctu-other.c Fri Dec 7 08:05:58 2018
@@ -0,0 +1,49 @@
+// Test typedef and global variable in function.
+typedef struct {
+ int a;
+ int b;
+} FooBar;
+FooBar fb;
+int f(int i) {
+ if (fb.a) {
+ fb.b = i;
+ }
+ return 1;
+}
+
+// Test enums.
+enum B { x = 42,
+ l,
+ s };
+int enumCheck(void) {
+ return x;
+}
+
+// Test reporting an error in macro definition
+#define MYMACRO(ctx) \
+ ctx->a;
+struct S {
+ int a;
+};
+int g(struct S *ctx) {
+ MYMACRO(ctx);
+ return 0;
+}
+
+// Test that asm import does not fail.
+int inlineAsm() {
+ int res;
+ asm("mov $42, %0"
+ : "=r"(res));
+ return res;
+}
+
+// Implicit function.
+int identImplicit(int in) {
+ return in;
+}
+
+// ASTImporter doesn't support this construct.
+int structInProto(struct DataType {int a;int b; } * d) {
+ return 0;
+}
Added: cfe/trunk/test/Analysis/Inputs/ctu-other.c.externalFnMap.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/ctu-other.c.externalFnMap.txt?rev=348605&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/Inputs/ctu-other.c.externalFnMap.txt (added)
+++ cfe/trunk/test/Analysis/Inputs/ctu-other.c.externalFnMap.txt Fri Dec 7 08:05:58 2018
@@ -0,0 +1,6 @@
+c:@F at inlineAsm ctu-other.c.ast
+c:@F at g ctu-other.c.ast
+c:@F at f ctu-other.c.ast
+c:@F at enumCheck ctu-other.c.ast
+c:@F at identImplicit ctu-other.c.ast
+c:@F at structInProto ctu-other.c.ast
Copied: cfe/trunk/test/Analysis/Inputs/ctu-other.cpp.externalFnMap.txt (from r348594, cfe/trunk/test/Analysis/Inputs/externalFnMap.txt)
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/ctu-other.cpp.externalFnMap.txt?p2=cfe/trunk/test/Analysis/Inputs/ctu-other.cpp.externalFnMap.txt&p1=cfe/trunk/test/Analysis/Inputs/externalFnMap.txt&r1=348594&r2=348605&rev=348605&view=diff
==============================================================================
(empty)
Removed: cfe/trunk/test/Analysis/Inputs/externalFnMap.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/externalFnMap.txt?rev=348604&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/Inputs/externalFnMap.txt (original)
+++ cfe/trunk/test/Analysis/Inputs/externalFnMap.txt (removed)
@@ -1,15 +0,0 @@
-c:@N at chns@F at chf1#I# ctu-other.cpp.ast
-c:@N at myns@N at embed_ns@F at fens#I# ctu-other.cpp.ast
-c:@F at g#I# ctu-other.cpp.ast
-c:@S at mycls@F at fscl#I#S ctu-other.cpp.ast
-c:@S at mycls@F at fcl#I# ctu-other.cpp.ast
-c:@N at myns@S at embed_cls@F at fecl#I# ctu-other.cpp.ast
-c:@S at mycls@S at embed_cls2@F at fecl2#I# ctu-other.cpp.ast
-c:@F at f#I# ctu-other.cpp.ast
-c:@N at myns@F at fns#I# ctu-other.cpp.ast
-c:@F at h#I# ctu-other.cpp.ast
-c:@F at h_chain#I# ctu-chain.cpp.ast
-c:@N at chns@S at chcls@F at chf4#I# ctu-chain.cpp.ast
-c:@N at chns@F at chf2#I# ctu-chain.cpp.ast
-c:@F at fun_using_anon_struct#I# ctu-other.cpp.ast
-c:@F at other_macro_diag#I# ctu-other.cpp.ast
Added: cfe/trunk/test/Analysis/ctu-main.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/ctu-main.c?rev=348605&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/ctu-main.c (added)
+++ cfe/trunk/test/Analysis/ctu-main.c Fri Dec 7 08:05:58 2018
@@ -0,0 +1,67 @@
+// RUN: rm -rf %t && mkdir %t
+// RUN: mkdir -p %t/ctudir2
+// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu \
+// RUN: -emit-pch -o %t/ctudir2/ctu-other.c.ast %S/Inputs/ctu-other.c
+// RUN: cp %S/Inputs/ctu-other.c.externalFnMap.txt %t/ctudir2/externalFnMap.txt
+// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -std=c89 -analyze \
+// RUN: -analyzer-checker=core,debug.ExprInspection \
+// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN: -analyzer-config ctu-dir=%t/ctudir2 \
+// RUN: -verify %s
+
+void clang_analyzer_eval(int);
+
+// Test typedef and global variable in function.
+typedef struct {
+ int a;
+ int b;
+} FooBar;
+extern FooBar fb;
+int f(int);
+void testGlobalVariable() {
+ clang_analyzer_eval(f(5) == 1); // expected-warning{{TRUE}}
+}
+
+// Test enums.
+int enumCheck(void);
+enum A { x,
+ y,
+ z };
+void testEnum() {
+ clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
+ clang_analyzer_eval(enumCheck() == 42); // expected-warning{{TRUE}}
+}
+
+// Test that asm import does not fail.
+int inlineAsm();
+int testInlineAsm() {
+ return inlineAsm();
+}
+
+// Test reporting error in a macro.
+struct S;
+int g(struct S *);
+void testMacro(void) {
+ g(0); // expected-warning at Inputs/ctu-other.c:29 {{Access to field 'a' results in a dereference of a null pointer (loaded from variable 'ctx')}}
+}
+
+// The external function prototype is incomplete.
+// warning:implicit functions are prohibited by c99
+void testImplicit() {
+ int res = identImplicit(6); // external implicit functions are not inlined
+ clang_analyzer_eval(res == 6); // expected-warning{{TRUE}}
+}
+
+// Tests the import of functions that have a struct parameter
+// defined in its prototype.
+struct DataType {
+ int a;
+ int b;
+};
+int structInProto(struct DataType *d);
+void testStructDefInArgument() {
+ struct DataType d;
+ d.a = 1;
+ d.b = 0;
+ clang_analyzer_eval(structInProto(&d) == 0); // expected-warning{{TRUE}} expected-warning{{FALSE}}
+}
Modified: cfe/trunk/test/Analysis/ctu-main.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/ctu-main.cpp?rev=348605&r1=348604&r2=348605&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/ctu-main.cpp (original)
+++ cfe/trunk/test/Analysis/ctu-main.cpp Fri Dec 7 08:05:58 2018
@@ -4,7 +4,7 @@
// RUN: -emit-pch -o %t/ctudir/ctu-other.cpp.ast %S/Inputs/ctu-other.cpp
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu \
// RUN: -emit-pch -o %t/ctudir/ctu-chain.cpp.ast %S/Inputs/ctu-chain.cpp
-// RUN: cp %S/Inputs/externalFnMap.txt %t/ctudir/
+// RUN: cp %S/Inputs/ctu-other.cpp.externalFnMap.txt %t/ctudir/externalFnMap.txt
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu \
// RUN: -analyzer-checker=core,debug.ExprInspection \
// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \
More information about the cfe-commits
mailing list