Author: Adam Balogh Date: 2020-03-30T09:14:45+02:00 New Revision: afcb77cc88a2ed489bbd383774c54daa82340761
URL: https://github.com/llvm/llvm-project/commit/afcb77cc88a2ed489bbd383774c54daa82340761 DIFF: https://github.com/llvm/llvm-project/commit/afcb77cc88a2ed489bbd383774c54daa82340761.diff LOG: [Analyzer] Fix for incorrect use of container and iterator checkers Iterator checkers (and planned container checkers) need the option aggressive-binary-operation-simplification to be enabled. Without this option they may cause assertions. To prevent such misuse, this patch adds a preventive check which issues a warning and denies the registartion of the checker if this option is disabled. Differential Revision: https://reviews.llvm.org/D75171 Added: clang/test/Analysis/container-modeling-no-aggressive-binary-operation-simplification-warn.cpp clang/test/Analysis/iterator-modeling-no-aggressive-binary-operation-simplification-no-crash.cpp Modified: clang/include/clang/Basic/DiagnosticDriverKinds.td clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp clang/test/Analysis/loop-widening-notes.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 5a3249215189..27ffd562c6de 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -344,6 +344,8 @@ def err_analyzer_checker_option_unknown : Error< "checker '%0' has no option called '%1'">; def err_analyzer_checker_option_invalid_input : Error< "invalid input for checker option '%0', that expects %1">; +def err_analyzer_checker_incompatible_analyzer_option : Error< + "checker cannot be enabled with analyzer option '%0' == %1">; def err_drv_invalid_hvx_length : Error< "-mhvx-length is not supported without a -mhvx/-mhvx= flag">; diff --git a/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp b/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp index 0af10cec9378..73c6517fd0eb 100644 --- a/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp @@ -12,6 +12,7 @@ #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/AST/DeclTemplate.h" +#include "clang/Driver/DriverDiagnostic.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" @@ -1068,5 +1069,15 @@ void ento::registerContainerModeling(CheckerManager &mgr) { } bool ento::shouldRegisterContainerModeling(const CheckerManager &mgr) { + if (!mgr.getLangOpts().CPlusPlus) + return false; + + if (!mgr.getAnalyzerOptions().ShouldAggressivelySimplifyBinaryOperation) { + mgr.getASTContext().getDiagnostics().Report( + diag::err_analyzer_checker_incompatible_analyzer_option) + << "aggressive-binary-operation-simplification" << "false"; + return false; + } + return true; } diff --git a/clang/test/Analysis/container-modeling-no-aggressive-binary-operation-simplification-warn.cpp b/clang/test/Analysis/container-modeling-no-aggressive-binary-operation-simplification-warn.cpp new file mode 100644 index 000000000000..1a55e878f9ef --- /dev/null +++ b/clang/test/Analysis/container-modeling-no-aggressive-binary-operation-simplification-warn.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.ContainerModeling\ +// RUN: %s 2>&1 | FileCheck %s + +// XFAIL: * + +// CHECK: checker cannot be enabled with analyzer option 'aggressive-binary-operation-simplification' == false diff --git a/clang/test/Analysis/iterator-modeling-no-aggressive-binary-operation-simplification-no-crash.cpp b/clang/test/Analysis/iterator-modeling-no-aggressive-binary-operation-simplification-no-crash.cpp new file mode 100644 index 000000000000..4b7c52db5462 --- /dev/null +++ b/clang/test/Analysis/iterator-modeling-no-aggressive-binary-operation-simplification-no-crash.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: %s 2>&1 | FileCheck %s + +// XFAIL: * + +// CHECK: checker cannot be enabled with analyzer option 'aggressive-binary-operation-simplification' == false + +#include "Inputs/system-header-simulator-cxx.h" + +void clang_analyzer_eval(bool); + +void comparison(std::vector<int> &V) { + clang_analyzer_eval(V.begin() == V.end()); // no-crash +} diff --git a/clang/test/Analysis/loop-widening-notes.cpp b/clang/test/Analysis/loop-widening-notes.cpp index 2c26a1490e5c..0ba71d030d05 100644 --- a/clang/test/Analysis/loop-widening-notes.cpp +++ b/clang/test/Analysis/loop-widening-notes.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha -analyzer-max-loop 2 -analyzer-config widen-loops=true -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core -analyzer-max-loop 2 -analyzer-config widen-loops=true -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s int *p_a; int bar(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits