Skip to content

Commit 1b93a24

Browse files
author
Kristof Umann
committed
Reland "[analyzer] Add an example plugin for checker dependency handling"
Buildbots complained that they couldn't find the newly added plugins. The solution was to move the check-clang cmake target closer to the bottom of the file, after the new dependencies are added. Differential Revision: https://reviews.llvm.org/D59464 llvm-svn: 360891
1 parent 0732fcc commit 1b93a24

11 files changed

+101
-27
lines changed

clang/examples/CMakeLists.txt

-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ if(NOT CLANG_BUILD_EXAMPLES)
33
set(EXCLUDE_FROM_ALL ON)
44
endif()
55

6-
if(CLANG_ENABLE_STATIC_ANALYZER)
7-
add_subdirectory(analyzer-plugin)
8-
endif()
96
add_subdirectory(clang-interpreter)
107
add_subdirectory(PrintFunctionNames)
118
add_subdirectory(AnnotateFunctions)

clang/test/Analysis/checker-plugins.c

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
// RUN: %clang_analyze_cc1 -load %llvmshlibdir/SampleAnalyzerPlugin%pluginext -analyzer-checker='example.MainCallChecker' -verify %s
2-
// REQUIRES: plugins, examples
1+
// RUN: %clang_analyze_cc1 -verify %s \
2+
// RUN: -load %llvmshlibdir/SampleAnalyzerPlugin%pluginext \
3+
// RUN: -analyzer-checker='example.MainCallChecker'
4+
5+
// REQUIRES: plugins
36

47
// Test that the MainCallChecker example analyzer plugin loads and runs.
58

@@ -8,3 +11,22 @@ int main();
811
void caller() {
912
main(); // expected-warning {{call to main}}
1013
}
14+
15+
// RUN: %clang_analyze_cc1 %s \
16+
// RUN: -load %llvmshlibdir/CheckerDependencyHandlingAnalyzerPlugin%pluginext\
17+
// RUN: -analyzer-checker=example.DependendentChecker \
18+
// RUN: -analyzer-list-enabled-checkers \
19+
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-IMPLICITLY-ENABLED
20+
21+
// CHECK-IMPLICITLY-ENABLED: example.Dependency
22+
// CHECK-IMPLICITLY-ENABLED: example.DependendentChecker
23+
24+
// RUN: %clang_analyze_cc1 %s \
25+
// RUN: -load %llvmshlibdir/CheckerDependencyHandlingAnalyzerPlugin%pluginext\
26+
// RUN: -analyzer-checker=example.DependendentChecker \
27+
// RUN: -analyzer-disable-checker=example.Dependency \
28+
// RUN: -analyzer-list-enabled-checkers \
29+
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-IMPLICITLY-DISABLED
30+
31+
// CHECK-IMPLICITLY-DISABLED-NOT: example.Dependency
32+
// CHECK-IMPLICITLY-DISABLED-NOT: example.DependendentChecker

clang/test/Analysis/lit.local.cfg

+2
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ config.substitutions.append(('%diff_plist',
1818
config.substitutions.append(('%diff_sarif',
1919
'''diff -U1 -w -I ".*file:.*%basename_t" -I '"version":' -I "2\.0\.0\-csd\.[0-9]*\.beta\."'''))
2020

21+
config.excludes.add('plugins')
22+
2123
if not config.root.clang_staticanalyzer:
2224
config.unsupported = True
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
add_subdirectory(SampleAnalyzer)
2+
add_subdirectory(CheckerDependencyHandling)
3+
4+
set(CLANG_ANALYZER_PLUGIN_DEPS
5+
SampleAnalyzerPlugin
6+
CheckerDependencyHandlingAnalyzerPlugin
7+
)
8+
9+
add_custom_target(clang-analyzer-plugin
10+
DEPENDS ${CLANG_ANALYZER_PLUGIN_DEPS})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CheckerDependencyHandlingAnalyzerPlugin.exports)
2+
add_llvm_library(CheckerDependencyHandlingAnalyzerPlugin MODULE CheckerDependencyHandling.cpp PLUGIN_TOOL clang)
3+
4+
if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
5+
target_link_libraries(CheckerDependencyHandlingAnalyzerPlugin PRIVATE
6+
clangAnalysis
7+
clangAST
8+
clangStaticAnalyzerCore
9+
LLVMSupport
10+
)
11+
endif()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
2+
#include "clang/StaticAnalyzer/Core/Checker.h"
3+
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
4+
#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
5+
6+
using namespace clang;
7+
using namespace ento;
8+
9+
namespace {
10+
struct Dependency : public Checker<check::BeginFunction> {
11+
void checkBeginFunction(CheckerContext &Ctx) const {}
12+
};
13+
struct DependendentChecker : public Checker<check::BeginFunction> {
14+
void checkBeginFunction(CheckerContext &Ctx) const {}
15+
};
16+
} // end anonymous namespace
17+
18+
// Register plugin!
19+
extern "C" void clang_registerCheckers(CheckerRegistry &registry) {
20+
registry.addChecker<Dependency>("example.Dependency", "", "");
21+
registry.addChecker<DependendentChecker>("example.DependendentChecker", "",
22+
"");
23+
24+
registry.addDependency("example.DependendentChecker", "example.Dependency");
25+
}
26+
27+
extern "C" const char clang_analyzerAPIVersionString[] =
28+
CLANG_ANALYZER_API_VERSION_STRING;

clang/examples/analyzer-plugin/MainCallChecker.cpp renamed to clang/test/Analysis/plugins/SampleAnalyzer/MainCallChecker.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
#include "clang/StaticAnalyzer/Core/Checker.h"
21
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
3-
#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
2+
#include "clang/StaticAnalyzer/Core/Checker.h"
43
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
4+
#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
55

66
using namespace clang;
77
using namespace ento;
88

99
namespace {
10-
class MainCallChecker : public Checker < check::PreStmt<CallExpr> > {
10+
class MainCallChecker : public Checker<check::PreStmt<CallExpr>> {
1111
mutable std::unique_ptr<BugType> BT;
1212

1313
public:
1414
void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
1515
};
1616
} // end anonymous namespace
1717

18-
void MainCallChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const {
18+
void MainCallChecker::checkPreStmt(const CallExpr *CE,
19+
CheckerContext &C) const {
1920
const Expr *Callee = CE->getCallee();
2021
const FunctionDecl *FD = C.getSVal(Callee).getAsFunctionDecl();
2122

@@ -24,7 +25,7 @@ void MainCallChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const
2425

2526
// Get the name of the callee.
2627
IdentifierInfo *II = FD->getIdentifier();
27-
if (!II) // if no identifier, not a simple C function
28+
if (!II) // if no identifier, not a simple C function
2829
return;
2930

3031
if (II->isStr("main")) {
@@ -43,12 +44,11 @@ void MainCallChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const
4344
}
4445

4546
// Register plugin!
46-
extern "C"
47-
void clang_registerCheckers (CheckerRegistry &registry) {
47+
extern "C" void clang_registerCheckers(CheckerRegistry &registry) {
4848
registry.addChecker<MainCallChecker>(
4949
"example.MainCallChecker", "Disallows calls to functions called main",
5050
"");
5151
}
5252

53-
extern "C"
54-
const char clang_analyzerAPIVersionString[] = CLANG_ANALYZER_API_VERSION_STRING;
53+
extern "C" const char clang_analyzerAPIVersionString[] =
54+
CLANG_ANALYZER_API_VERSION_STRING;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
clang_registerCheckers
2+
clang_analyzerAPIVersionString

clang/test/CMakeLists.txt

+15-13
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,10 @@ if( NOT CLANG_BUILT_STANDALONE )
123123
endif()
124124
endif()
125125

126-
add_custom_target(clang-test-depends DEPENDS ${CLANG_TEST_DEPS})
127-
set_target_properties(clang-test-depends PROPERTIES FOLDER "Clang tests")
128-
129-
add_lit_testsuite(check-clang "Running the Clang regression tests"
130-
${CMAKE_CURRENT_BINARY_DIR}
131-
#LIT ${LLVM_LIT}
132-
PARAMS ${CLANG_TEST_PARAMS}
133-
DEPENDS ${CLANG_TEST_DEPS}
134-
ARGS ${CLANG_TEST_EXTRA_ARGS}
135-
)
136-
set_target_properties(check-clang PROPERTIES FOLDER "Clang tests")
137-
138126
if (CLANG_ENABLE_STATIC_ANALYZER)
127+
add_subdirectory(Analysis/plugins)
128+
list(APPEND CLANG_TEST_DEPS clang-analyzer-plugin)
129+
139130
# check-all would launch those tests via check-clang.
140131
set(EXCLUDE_FROM_ALL ON)
141132

@@ -145,7 +136,6 @@ if (CLANG_ENABLE_STATIC_ANALYZER)
145136
DEPENDS ${CLANG_TEST_DEPS})
146137
set_target_properties(check-clang-analyzer PROPERTIES FOLDER "Clang tests")
147138

148-
149139
if (LLVM_WITH_Z3)
150140
add_lit_testsuite(check-clang-analyzer-z3 "Running the Clang analyzer tests, using Z3 as a solver"
151141
${CMAKE_CURRENT_BINARY_DIR}/Analysis
@@ -157,6 +147,18 @@ if (CLANG_ENABLE_STATIC_ANALYZER)
157147
set(EXCLUDE_FROM_ALL OFF)
158148
endif()
159149

150+
add_custom_target(clang-test-depends DEPENDS ${CLANG_TEST_DEPS})
151+
set_target_properties(clang-test-depends PROPERTIES FOLDER "Clang tests")
152+
153+
add_lit_testsuite(check-clang "Running the Clang regression tests"
154+
${CMAKE_CURRENT_BINARY_DIR}
155+
#LIT ${LLVM_LIT}
156+
PARAMS ${CLANG_TEST_PARAMS}
157+
DEPENDS ${CLANG_TEST_DEPS}
158+
ARGS ${CLANG_TEST_EXTRA_ARGS}
159+
)
160+
set_target_properties(check-clang PROPERTIES FOLDER "Clang tests")
161+
160162
add_lit_testsuites(CLANG ${CMAKE_CURRENT_SOURCE_DIR}
161163
PARAMS ${CLANG_TEST_PARAMS}
162164
DEPENDS ${CLANG_TEST_DEPS}

0 commit comments

Comments
 (0)