[analyzer] Don't allow hidden checkers to emit diagnostics
Hidden checkers (those marked with Hidden in Checkers.td) are meant for development purposes only, and are only displayed under -analyzer-checker-help-developer, so users shouldn't see reports from them. I moved StdLibraryFunctionsArg checker to the unix package from apiModeling as it violated this rule. I believe this change doesn't deserve a different revision because it is in alpha, and the name is so bad anyways I don't immediately care where it is, because we'll have to revisit it soon enough. Differential Revision: https://reviews.llvm.org/D81750
This commit is contained in:
parent
afdb2ef2ed
commit
cfd6b4b811
|
@ -375,18 +375,6 @@ def TrustNonnullChecker : Checker<"TrustNonnull">,
|
|||
|
||||
} // end "apiModeling"
|
||||
|
||||
let ParentPackage = APIModelingAlpha in {
|
||||
|
||||
def StdCLibraryFunctionArgsChecker : Checker<"StdCLibraryFunctionArgs">,
|
||||
HelpText<"Check constraints of arguments of C standard library functions, "
|
||||
"such as whether the parameter of isalpha is in the range [0, 255] "
|
||||
"or is EOF.">,
|
||||
Dependencies<[StdCLibraryFunctionsChecker]>,
|
||||
WeakDependencies<[NonNullParamChecker]>,
|
||||
Documentation<NotDocumented>;
|
||||
|
||||
} // end "alpha.apiModeling"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Evaluate "builtin" functions.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -545,6 +533,14 @@ def BlockInCriticalSectionChecker : Checker<"BlockInCriticalSection">,
|
|||
HelpText<"Check for calls to blocking functions inside a critical section">,
|
||||
Documentation<HasAlphaDocumentation>;
|
||||
|
||||
def StdCLibraryFunctionArgsChecker : Checker<"StdCLibraryFunctionArgs">,
|
||||
HelpText<"Check constraints of arguments of C standard library functions, "
|
||||
"such as whether the parameter of isalpha is in the range [0, 255] "
|
||||
"or is EOF.">,
|
||||
Dependencies<[StdCLibraryFunctionsChecker]>,
|
||||
WeakDependencies<[NonNullParamChecker]>,
|
||||
Documentation<NotDocumented>;
|
||||
|
||||
} // end "alpha.unix"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -2108,8 +2108,8 @@ void BuiltinBug::anchor() {}
|
|||
// Methods for BugReport and subclasses.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static bool isDependency(const CheckerRegistryData &Registry,
|
||||
StringRef CheckerName) {
|
||||
LLVM_ATTRIBUTE_USED static bool
|
||||
isDependency(const CheckerRegistryData &Registry, StringRef CheckerName) {
|
||||
for (const std::pair<StringRef, StringRef> &Pair : Registry.Dependencies) {
|
||||
if (Pair.second == CheckerName)
|
||||
return true;
|
||||
|
@ -2117,6 +2117,17 @@ static bool isDependency(const CheckerRegistryData &Registry,
|
|||
return false;
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_USED static bool isHidden(const CheckerRegistryData &Registry,
|
||||
StringRef CheckerName) {
|
||||
for (const CheckerInfo &Checker : Registry.Checkers) {
|
||||
if (Checker.FullName == CheckerName)
|
||||
return Checker.IsHidden;
|
||||
}
|
||||
llvm_unreachable(
|
||||
"Checker name not found in CheckerRegistry -- did you retrieve it "
|
||||
"correctly from CheckerManager::getCurrentCheckerName?");
|
||||
}
|
||||
|
||||
PathSensitiveBugReport::PathSensitiveBugReport(
|
||||
const BugType &bt, StringRef shortDesc, StringRef desc,
|
||||
const ExplodedNode *errorNode, PathDiagnosticLocation LocationToUnique,
|
||||
|
@ -2132,6 +2143,16 @@ PathSensitiveBugReport::PathSensitiveBugReport(
|
|||
"Some checkers depend on this one! We don't allow dependency "
|
||||
"checkers to emit warnings, because checkers should depend on "
|
||||
"*modeling*, not *diagnostics*.");
|
||||
|
||||
assert(
|
||||
bt.getCheckerName().startswith("debug") ||
|
||||
!isHidden(ErrorNode->getState()
|
||||
->getAnalysisManager()
|
||||
.getCheckerManager()
|
||||
->getCheckerRegistryData(),
|
||||
bt.getCheckerName()) &&
|
||||
"Hidden checkers musn't emit diagnostics as they are by definition "
|
||||
"non-user facing!");
|
||||
}
|
||||
|
||||
void PathSensitiveBugReport::addVisitor(
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
// RUN: %clang_analyze_cc1 %s \
|
||||
// RUN: -analyzer-checker=core \
|
||||
// RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \
|
||||
// RUN: -analyzer-checker=alpha.apiModeling.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=debug.StdCLibraryFunctionsTester \
|
||||
// RUN: -analyzer-checker=debug.ExprInspection \
|
||||
// RUN: -triple x86_64-unknown-linux-gnu \
|
||||
|
@ -12,7 +12,7 @@
|
|||
// RUN: %clang_analyze_cc1 %s \
|
||||
// RUN: -analyzer-checker=core \
|
||||
// RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \
|
||||
// RUN: -analyzer-checker=alpha.apiModeling.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=debug.StdCLibraryFunctionsTester \
|
||||
// RUN: -analyzer-checker=debug.ExprInspection \
|
||||
// RUN: -triple x86_64-unknown-linux-gnu \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// RUN: %clang_analyze_cc1 %s \
|
||||
// RUN: -analyzer-checker=core \
|
||||
// RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \
|
||||
// RUN: -analyzer-checker=alpha.apiModeling.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=debug.StdCLibraryFunctionsTester \
|
||||
// RUN: -analyzer-checker=debug.ExprInspection \
|
||||
// RUN: -analyzer-config eagerly-assume=false \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_analyze_cc1 %s -verify \
|
||||
// RUN: -analyzer-checker=alpha.apiModeling.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \
|
||||
// RUN: -analyzer-checker=core
|
||||
|
||||
typedef __typeof(sizeof(int)) size_t;
|
||||
|
|
Loading…
Reference in New Issue