// RUN: rm -rf %t // RUN: mkdir -p %t // RUN: cp "%s" "%t/ctu-on-demand-parsing.c" // RUN: cp "%S/Inputs/ctu-other.c" "%t/ctu-other.c" // // Path substitutions on Windows platform could contain backslashes. These are escaped in the json file. // compile_commands.json is only needed for extdef_mapping, not for the analysis itself. // RUN: echo '[{"directory":"%t","command":"gcc -std=c89 -Wno-visibility ctu-other.c","file":"ctu-other.c"}]' | sed -e 's/\\/\\\\/g' > %t/compile_commands.json // // RUN: echo '"%t/ctu-other.c": ["gcc", "-std=c89", "-Wno-visibility", "ctu-other.c"]' | sed -e 's/\\/\\\\/g' > %t/invocations.yaml // // RUN: cd "%t" && %clang_extdef_map "%t/ctu-other.c" > externalDefMap.txt // // RUN: cd "%t" && %clang_cc1 -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=. \ // RUN: -analyzer-config ctu-invocation-list=invocations.yaml \ // RUN: -verify ctu-on-demand-parsing.c // // FIXME: Path handling should work on all platforms. // REQUIRES: system-linux 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@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}} // Call something with uninitialized from the same function in which the // implicit was called. This is necessary to reproduce a special bug in // NoStoreFuncVisitor. int uninitialized; h(uninitialized); // expected-warning{{1st function call argument is an uninitialized value}} } // 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}} }