Szelethus created this revision. Szelethus added reviewers: NoQ, vsavchenko, dcoughlin, xazax.hun, balazske, martong, baloghadamsoftware. Szelethus added a project: clang. Herald added subscribers: cfe-commits, ASDenysPetrov, steakhal, Charusso, gamesh411, dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, rnkovacs, szepet, whisperity. Szelethus edited the summary of this revision.
Since strong dependencies aren't user-facing (its hardly ever legal to disable them), lets enforce that they are hidden. Modeling checkers that aren't dependencies are of course not impacted, but there is only so much you can do against developers shooting themselves in the foot :^) I also made some changes to the test files, reversing the "test" package for, well, testing. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D81761 Files: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td clang/lib/Analysis/plugins/CheckerDependencyHandling/CheckerDependencyHandling.cpp clang/lib/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp clang/lib/Analysis/plugins/SampleAnalyzer/MainCallChecker.cpp clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp clang/test/Analysis/checker-plugins.c clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
Index: clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp =================================================================== --- clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp +++ clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp @@ -41,17 +41,16 @@ void addCustomChecker(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.CustomChecker", true}}; + AnOpts.CheckersAndPackages = {{"test.CustomChecker", true}}; AnalysisConsumer.AddCheckerRegistrationFn([](CheckerRegistry &Registry) { - Registry.addChecker<CustomChecker>("custom.CustomChecker", "Description", - ""); + Registry.addChecker<CustomChecker>("test.CustomChecker", "Description", ""); }); } TEST(RegisterCustomCheckers, RegisterChecker) { std::string Diags; EXPECT_TRUE(runCheckerOnCode<addCustomChecker>("void f() {;}", Diags)); - EXPECT_EQ(Diags, "custom.CustomChecker:Custom diagnostic description\n"); + EXPECT_EQ(Diags, "test.CustomChecker:Custom diagnostic description\n"); } //===----------------------------------------------------------------------===// @@ -120,7 +119,7 @@ void addCheckerRegistrationOrderPrinter(CheckerRegistry &Registry) { Registry.addChecker(registerCheckerRegistrationOrderPrinter, shouldRegisterCheckerRegistrationOrderPrinter, - "custom.RegistrationOrder", "Description", "", false); + "test.RegistrationOrder", "Description", "", false); } #define UNITTEST_CHECKER(CHECKER_NAME, DIAG_MSG) \ @@ -141,7 +140,7 @@ } \ void add##CHECKER_NAME(CheckerRegistry &Registry) { \ Registry.addChecker(register##CHECKER_NAME, shouldRegister##CHECKER_NAME, \ - "custom." #CHECKER_NAME, "Description", "", false); \ + "test." #CHECKER_NAME, "Description", "", false); \ } UNITTEST_CHECKER(StrongDep, "Strong") @@ -154,22 +153,22 @@ void addDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([](CheckerRegistry &Registry) { Registry.addChecker(registerStrongDep, shouldRegisterStrongFALSE, - "custom.Strong", "Description", "", false); + "test.Strong", "Description", "", false); addStrongDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.Dep", "custom.Strong"); + Registry.addDependency("test.Dep", "test.Strong"); }); } TEST(RegisterDeps, UnsatisfiedDependency) { std::string Diags; EXPECT_TRUE(runCheckerOnCode<addDep>("void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.RegistrationOrder\n"); } //===----------------------------------------------------------------------===// @@ -180,52 +179,52 @@ void addWeakDepCheckerBothEnabled(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addWeakDepCheckerBothEnabledSwitched(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.WeakDep", "custom.Dep"); + Registry.addWeakDependency("test.WeakDep", "test.Dep"); }); } void addWeakDepCheckerDepDisabled(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", false}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", false}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addWeakDepCheckerDepUnspecified(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } @@ -234,10 +233,10 @@ void addWeakDepHasWeakDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", true}, - {"custom.WeakDep2", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", true}, + {"test.WeakDep2", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); @@ -245,17 +244,17 @@ addDep(Registry); addDep2(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); - Registry.addWeakDependency("custom.WeakDep", "custom.WeakDep2"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); + Registry.addWeakDependency("test.WeakDep", "test.WeakDep2"); }); } void addWeakDepTransitivity(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", false}, - {"custom.WeakDep2", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", false}, + {"test.WeakDep2", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); @@ -263,8 +262,8 @@ addDep(Registry); addDep2(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); - Registry.addWeakDependency("custom.WeakDep", "custom.WeakDep2"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); + Registry.addWeakDependency("test.WeakDep", "test.WeakDep2"); }); } @@ -272,42 +271,40 @@ std::string Diags; EXPECT_TRUE(runCheckerOnCode<addWeakDepCheckerBothEnabled>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.WeakDep\ncustom." - "Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.WeakDep\ntest." + "Dep\ntest.RegistrationOrder\n"); Diags.clear(); // Mind that AnalyzerOption listed the enabled checker list in the same order, // but the dependencies are switched. EXPECT_TRUE(runCheckerOnCode<addWeakDepCheckerBothEnabledSwitched>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.Dep\ncustom." - "RegistrationOrder\ncustom.WeakDep\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest." + "RegistrationOrder\ntest.WeakDep\n"); Diags.clear(); // Weak dependencies dont prevent dependent checkers from being enabled. EXPECT_TRUE(runCheckerOnCode<addWeakDepCheckerDepDisabled>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, - "custom.RegistrationOrder:custom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest.RegistrationOrder\n"); Diags.clear(); // Nor will they be enabled just because a dependent checker is. EXPECT_TRUE(runCheckerOnCode<addWeakDepCheckerDepUnspecified>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, - "custom.RegistrationOrder:custom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest.RegistrationOrder\n"); Diags.clear(); EXPECT_TRUE( runCheckerOnCode<addWeakDepTransitivity>("void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.WeakDep2\ncustom." - "Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.WeakDep2\ntest." + "Dep\ntest.RegistrationOrder\n"); Diags.clear(); EXPECT_TRUE( runCheckerOnCode<addWeakDepHasWeakDep>("void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.WeakDep2\ncustom." - "WeakDep\ncustom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.WeakDep2\ntest." + "WeakDep\ntest.Dep\ntest.RegistrationOrder\n"); Diags.clear(); } @@ -317,98 +314,98 @@ void addWeakDepHasStrongDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.StrongDep", true}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.StrongDep", true}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.WeakDep", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.WeakDep", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addWeakDepAndStrongDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.StrongDep", true}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.StrongDep", true}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.Dep", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.Dep", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addDisabledWeakDepHasStrongDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.StrongDep", true}, - {"custom.WeakDep", false}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.StrongDep", true}, + {"test.WeakDep", false}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.WeakDep", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.WeakDep", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addDisabledWeakDepHasUnspecifiedStrongDep( AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.WeakDep", false}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.WeakDep", false}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.WeakDep", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.WeakDep", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addWeakDepHasDisabledStrongDep(AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.StrongDep", false}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.StrongDep", false}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.WeakDep", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.WeakDep", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } void addWeakDepHasUnspecifiedButLaterEnabledStrongDep( AnalysisASTConsumer &AnalysisConsumer, AnalyzerOptions &AnOpts) { - AnOpts.CheckersAndPackages = {{"custom.Dep", true}, - {"custom.Dep2", true}, - {"custom.WeakDep", true}, - {"custom.RegistrationOrder", true}}; + AnOpts.CheckersAndPackages = {{"test.Dep", true}, + {"test.Dep2", true}, + {"test.WeakDep", true}, + {"test.RegistrationOrder", true}}; AnalysisConsumer.AddCheckerRegistrationFn([=](CheckerRegistry &Registry) { addStrongDep(Registry); addWeakDep(Registry); addDep(Registry); addDep2(Registry); addCheckerRegistrationOrderPrinter(Registry); - Registry.addDependency("custom.WeakDep", "custom.StrongDep"); - Registry.addDependency("custom.Dep2", "custom.StrongDep"); - Registry.addWeakDependency("custom.Dep", "custom.WeakDep"); + Registry.addDependency("test.WeakDep", "test.StrongDep"); + Registry.addDependency("test.Dep2", "test.StrongDep"); + Registry.addWeakDependency("test.Dep", "test.WeakDep"); }); } @@ -416,8 +413,8 @@ std::string Diags; EXPECT_TRUE( runCheckerOnCode<addWeakDepHasStrongDep>("void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.StrongDep\ncustom." - "WeakDep\ncustom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.StrongDep\ntest." + "WeakDep\ntest.Dep\ntest.RegistrationOrder\n"); Diags.clear(); // Weak dependencies are registered before strong dependencies. This is most @@ -426,39 +423,36 @@ // established in between the modeling portion and the weak dependency. EXPECT_TRUE( runCheckerOnCode<addWeakDepAndStrongDep>("void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.WeakDep\ncustom." - "StrongDep\ncustom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.WeakDep\ntest." + "StrongDep\ntest.Dep\ntest.RegistrationOrder\n"); Diags.clear(); // If a weak dependency is disabled, the checker itself can still be enabled. EXPECT_TRUE(runCheckerOnCode<addDisabledWeakDepHasStrongDep>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, "custom.RegistrationOrder:custom.Dep\ncustom." - "RegistrationOrder\ncustom.StrongDep\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest." + "RegistrationOrder\ntest.StrongDep\n"); Diags.clear(); // If a weak dependency is disabled, the checker itself can still be enabled, // but it shouldn't enable a strong unspecified dependency. EXPECT_TRUE(runCheckerOnCode<addDisabledWeakDepHasUnspecifiedStrongDep>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, - "custom.RegistrationOrder:custom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest.RegistrationOrder\n"); Diags.clear(); // A strong dependency of a weak dependency is disabled, so neither of them // should be enabled. EXPECT_TRUE(runCheckerOnCode<addWeakDepHasDisabledStrongDep>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, - "custom.RegistrationOrder:custom.Dep\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.Dep\ntest.RegistrationOrder\n"); Diags.clear(); EXPECT_TRUE( runCheckerOnCode<addWeakDepHasUnspecifiedButLaterEnabledStrongDep>( "void f() {int i;}", Diags)); - EXPECT_EQ(Diags, - "custom.RegistrationOrder:custom.StrongDep\ncustom.WeakDep\ncustom." - "Dep\ncustom.Dep2\ncustom.RegistrationOrder\n"); + EXPECT_EQ(Diags, "test.RegistrationOrder:test.StrongDep\ntest.WeakDep\ntest." + "Dep\ntest.Dep2\ntest.RegistrationOrder\n"); Diags.clear(); } } // namespace Index: clang/test/Analysis/checker-plugins.c =================================================================== --- clang/test/Analysis/checker-plugins.c +++ clang/test/Analysis/checker-plugins.c @@ -6,9 +6,9 @@ // RUN: %clang_analyze_cc1 -verify %s \ // RUN: -load %llvmshlibdir/SampleAnalyzerPlugin%pluginext \ -// RUN: -analyzer-checker='example.MainCallChecker' +// RUN: -analyzer-checker='test.MainCallChecker' -// Test that the MainCallChecker example analyzer plugin loads and runs. +// Test that the MainCallChecker test analyzer plugin loads and runs. int main(); @@ -18,102 +18,101 @@ // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerDependencyHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.DependendentChecker \ +// RUN: -analyzer-checker=test.DependendentChecker \ // RUN: -analyzer-list-enabled-checkers \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-IMPLICITLY-ENABLED -// CHECK-IMPLICITLY-ENABLED: example.Dependency -// CHECK-IMPLICITLY-ENABLED: example.DependendentChecker +// CHECK-IMPLICITLY-ENABLED: test.Dependency +// CHECK-IMPLICITLY-ENABLED: test.DependendentChecker // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerDependencyHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.DependendentChecker \ -// RUN: -analyzer-disable-checker=example.Dependency \ +// RUN: -analyzer-checker=test.DependendentChecker \ +// RUN: -analyzer-disable-checker=test.Dependency \ // RUN: -analyzer-list-enabled-checkers \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-IMPLICITLY-DISABLED -// CHECK-IMPLICITLY-DISABLED-NOT: example.Dependency -// CHECK-IMPLICITLY-DISABLED-NOT: example.DependendentChecker +// CHECK-IMPLICITLY-DISABLED-NOT: test.Dependency +// CHECK-IMPLICITLY-DISABLED-NOT: test.DependendentChecker // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-OUTPUT // CHECK-CHECKER-OPTION-OUTPUT: Example option is set to false // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ -// RUN: -analyzer-config example.MyChecker:ExampleOption=true \ +// RUN: -analyzer-checker=test.MyChecker \ +// RUN: -analyzer-config test.MyChecker:ExampleOption=true \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-OUTPUT-TRUE // CHECK-CHECKER-OPTION-OUTPUT-TRUE: Example option is set to true // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-checker=debug.ConfigDumper \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION -// CHECK-CHECKER-OPTION: example.MyChecker:ExampleOption = false +// CHECK-CHECKER-OPTION: test.MyChecker:ExampleOption = false // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-checker=debug.ConfigDumper \ -// RUN: -analyzer-config example.MyChecker:ExampleOption=true \ +// RUN: -analyzer-config test.MyChecker:ExampleOption=true \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-TRUE -// CHECK-CHECKER-OPTION-TRUE: example.MyChecker:ExampleOption = true +// CHECK-CHECKER-OPTION-TRUE: test.MyChecker:ExampleOption = true // RUN: not %clang_analyze_cc1 -verify %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ -// RUN: -analyzer-config example.MyChecker:Example=true \ +// RUN: -analyzer-checker=test.MyChecker \ +// RUN: -analyzer-config test.MyChecker:Example=true \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-NON-EXISTENT-CHECKER-OPTION -// CHECK-NON-EXISTENT-CHECKER-OPTION: (frontend): checker 'example.MyChecker' +// CHECK-NON-EXISTENT-CHECKER-OPTION: (frontend): checker 'test.MyChecker' // CHECK-NON-EXISTENT-CHECKER-OPTION-SAME: has no option called 'Example' // RUN: not %clang_analyze_cc1 -verify %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-config-compatibility-mode=true \ -// RUN: -analyzer-config example.MyChecker:Example=true - +// RUN: -analyzer-config test.MyChecker:Example=true // RUN: not %clang_analyze_cc1 -verify %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ -// RUN: -analyzer-config example.MyChecker:ExampleOption=example \ +// RUN: -analyzer-checker=test.MyChecker \ +// RUN: -analyzer-config test.MyChecker:ExampleOption=test \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-INVALID-BOOL-VALUE // CHECK-INVALID-BOOL-VALUE: (frontend): invalid input for checker option -// CHECK-INVALID-BOOL-VALUE-SAME: 'example.MyChecker:ExampleOption', that +// CHECK-INVALID-BOOL-VALUE-SAME: 'test.MyChecker:ExampleOption', that // CHECK-INVALID-BOOL-VALUE-SAME: expects a boolean value // RUN: not %clang_analyze_cc1 -verify %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-config-compatibility-mode=true \ -// RUN: -analyzer-config example.MyChecker:ExampleOption=example +// RUN: -analyzer-config test.MyChecker:ExampleOption=test // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-checker=debug.ConfigDumper \ // RUN: -analyzer-config-compatibility-mode=true \ -// RUN: -analyzer-config example.MyChecker:ExampleOption=example \ +// RUN: -analyzer-config test.MyChecker:ExampleOption=test \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CORRECTED-BOOL-VALUE -// CHECK-CORRECTED-BOOL-VALUE: example.MyChecker:ExampleOption = false +// CHECK-CORRECTED-BOOL-VALUE: test.MyChecker:ExampleOption = false // RUN: %clang_analyze_cc1 %s \ // RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\ -// RUN: -analyzer-checker=example.MyChecker \ +// RUN: -analyzer-checker=test.MyChecker \ // RUN: -analyzer-checker-option-help \ // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-HELP -// CHECK-CHECKER-OPTION-HELP: example.MyChecker:ExampleOption (bool) This is an -// CHECK-CHECKER-OPTION-HELP-SAME: example checker opt. (default: false) +// CHECK-CHECKER-OPTION-HELP: test.MyChecker:ExampleOption (bool) This is an +// CHECK-CHECKER-OPTION-HELP-SAME: test checker opt. (default: false) Index: clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp =================================================================== --- clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -447,6 +447,12 @@ DependencyIt->FullName == Entry.second && "Failed to find the dependency of a checker!"); + // We do allow diagnostics from unit test dependency checkers. + assert((DependencyIt->FullName.startswith("test") || IsWeak || + DependencyIt->IsHidden) && + "Strong dependencies are modeling checkers, and as such " + "non-user facing! Mark them hidden in Checkers.td!"); + if (IsWeak) CheckerIt->WeakDependencies.emplace_back(&*DependencyIt); else Index: clang/lib/Analysis/plugins/SampleAnalyzer/MainCallChecker.cpp =================================================================== --- clang/lib/Analysis/plugins/SampleAnalyzer/MainCallChecker.cpp +++ clang/lib/Analysis/plugins/SampleAnalyzer/MainCallChecker.cpp @@ -34,7 +34,7 @@ return; if (!BT) - BT.reset(new BugType(this, "call to main", "example analyzer plugin")); + BT.reset(new BugType(this, "call to main", "test analyzer plugin")); auto report = std::make_unique<PathSensitiveBugReport>(*BT, BT->getDescription(), N); @@ -46,8 +46,7 @@ // Register plugin! extern "C" void clang_registerCheckers(CheckerRegistry ®istry) { registry.addChecker<MainCallChecker>( - "example.MainCallChecker", "Disallows calls to functions called main", - ""); + "test.MainCallChecker", "Disallows calls to functions called main", ""); } extern "C" const char clang_analyzerAPIVersionString[] = Index: clang/lib/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp =================================================================== --- clang/lib/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp +++ clang/lib/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp @@ -28,15 +28,15 @@ // Register plugin! extern "C" void clang_registerCheckers(CheckerRegistry ®istry) { registry.addChecker(registerMyChecker, shouldRegisterMyChecker, - "example.MyChecker", "Example Description", - "example.mychecker.documentation.nonexistent.html", - /*isHidden*/false); + "test.MyChecker", "Example Description", + "test.mychecker.documentation.nonexistent.html", + /*isHidden*/ false); registry.addCheckerOption(/*OptionType*/ "bool", - /*CheckerFullName*/ "example.MyChecker", + /*CheckerFullName*/ "test.MyChecker", /*OptionName*/ "ExampleOption", /*DefaultValStr*/ "false", - /*Description*/ "This is an example checker opt.", + /*Description*/ "This is an test checker opt.", /*DevelopmentStage*/ "released"); } Index: clang/lib/Analysis/plugins/CheckerDependencyHandling/CheckerDependencyHandling.cpp =================================================================== --- clang/lib/Analysis/plugins/CheckerDependencyHandling/CheckerDependencyHandling.cpp +++ clang/lib/Analysis/plugins/CheckerDependencyHandling/CheckerDependencyHandling.cpp @@ -17,11 +17,10 @@ // Register plugin! extern "C" void clang_registerCheckers(CheckerRegistry ®istry) { - registry.addChecker<Dependency>("example.Dependency", "", ""); - registry.addChecker<DependendentChecker>("example.DependendentChecker", "", - ""); + registry.addChecker<Dependency>("test.Dependency", "", ""); + registry.addChecker<DependendentChecker>("test.DependendentChecker", "", ""); - registry.addDependency("example.DependendentChecker", "example.Dependency"); + registry.addDependency("test.DependendentChecker", "test.Dependency"); } extern "C" const char clang_analyzerAPIVersionString[] = Index: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td =================================================================== --- clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -130,7 +130,8 @@ "function/method call. For instance, if we can't reason about the " "nullability of the implicit this parameter after a method call, " "this checker conservatively assumes it to be non-null">, - Documentation<HasDocumentation>; + Documentation<HasDocumentation>, + Hidden; def CallAndMessageChecker : Checker<"CallAndMessage">, HelpText<"Check for logical errors for function calls and Objective-C " @@ -220,7 +221,8 @@ def DynamicTypePropagation : Checker<"DynamicTypePropagation">, HelpText<"Generate dynamic type information">, - Documentation<NotDocumented>; + Documentation<NotDocumented>, + Hidden; def NonnullGlobalConstantsChecker: Checker<"NonnilStringConstants">, HelpText<"Assume that const string-like globals are non-null">, @@ -356,7 +358,8 @@ "false", Released> ]>, - Documentation<NotDocumented>; + Documentation<NotDocumented>, + Hidden; def TrustNonnullChecker : Checker<"TrustNonnull">, HelpText<"Trust that returns from framework methods annotated with _Nonnull "
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits