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@inlineAsm ctu-other.c.ast +c:@F@g ctu-other.c.ast +c:@F@f ctu-other.c.ast +c:@F@enumCheck ctu-other.c.ast +c:@F@identImplicit ctu-other.c.ast +c:@F@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@chns@F@chf1#I# ctu-other.cpp.ast -c:@N@myns@N@embed_ns@F@fens#I# ctu-other.cpp.ast -c:@F@g#I# ctu-other.cpp.ast -c:@S@mycls@F@fscl#I#S ctu-other.cpp.ast -c:@S@mycls@F@fcl#I# ctu-other.cpp.ast -c:@N@myns@S@embed_cls@F@fecl#I# ctu-other.cpp.ast -c:@S@mycls@S@embed_cls2@F@fecl2#I# ctu-other.cpp.ast -c:@F@f#I# ctu-other.cpp.ast -c:@N@myns@F@fns#I# ctu-other.cpp.ast -c:@F@h#I# ctu-other.cpp.ast -c:@F@h_chain#I# ctu-chain.cpp.ast -c:@N@chns@S@chcls@F@chf4#I# ctu-chain.cpp.ast -c:@N@chns@F@chf2#I# ctu-chain.cpp.ast -c:@F@fun_using_anon_struct#I# ctu-other.cpp.ast -c:@F@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@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 \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits