Removed IdempotentOperationChecker from default analysis and returned back to a flag (-analyzer-check-idempotent-operations)
- Added IdempotentOperationChecker to experimental analyses for testing purposes - Updated test cases to explictly call the checker llvm-svn: 110482
This commit is contained in:
parent
45e07c8fc5
commit
925501c548
|
@ -60,6 +60,8 @@ def analysis_ObjCMemChecker : Flag<"-analyzer-check-objc-mem">,
|
|||
HelpText<"Run the [Core] Foundation reference count checker">;
|
||||
def analysis_WarnSizeofPointer : Flag<"-warn-sizeof-pointer">,
|
||||
HelpText<"Warn about unintended use of sizeof() on pointer expressions">;
|
||||
def analysis_WarnIdempotentOps : Flag<"-analyzer-check-idempotent-operations">,
|
||||
HelpText<"Warn about idempotent operations">;
|
||||
|
||||
def analyzer_store : Separate<"-analyzer-store">,
|
||||
HelpText<"Source Code Analysis - Abstract Memory Store Models">;
|
||||
|
|
|
@ -66,6 +66,7 @@ public:
|
|||
unsigned AnalyzerDisplayProgress : 1;
|
||||
unsigned AnalyzeNestedBlocks : 1;
|
||||
unsigned EagerlyAssume : 1;
|
||||
unsigned IdempotentOps : 1;
|
||||
unsigned PurgeDead : 1;
|
||||
unsigned TrimGraph : 1;
|
||||
unsigned VisualizeEGDot : 1;
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "clang/Checker/PathSensitive/GRTransferFuncs.h"
|
||||
#include "clang/Checker/PathDiagnosticClients.h"
|
||||
#include "GRExprEngineExperimentalChecks.h"
|
||||
#include "GRExprEngineInternalChecks.h"
|
||||
#include "clang/Basic/FileManager.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Frontend/AnalyzerOptions.h"
|
||||
|
@ -343,6 +344,12 @@ static void ActionGRExprEngine(AnalysisConsumer &C, AnalysisManager& mgr,
|
|||
if (C.Opts.EnableExperimentalChecks)
|
||||
RegisterExperimentalChecks(Eng);
|
||||
|
||||
// Enable idempotent operation checking if it was explicitly turned on, or if
|
||||
// we are running experimental checks (i.e. everything)
|
||||
if (C.Opts.IdempotentOps || C.Opts.EnableExperimentalChecks
|
||||
|| C.Opts.EnableExperimentalInternalChecks)
|
||||
RegisterIdempotentOperationChecker(Eng);
|
||||
|
||||
// Set the graph auditor.
|
||||
llvm::OwningPtr<ExplodedNode::Auditor> Auditor;
|
||||
if (mgr.shouldVisualizeUbigraph()) {
|
||||
|
|
|
@ -367,7 +367,6 @@ static void RegisterInternalChecks(GRExprEngine &Eng) {
|
|||
RegisterDereferenceChecker(Eng);
|
||||
RegisterVLASizeChecker(Eng);
|
||||
RegisterDivZeroChecker(Eng);
|
||||
RegisterIdempotentOperationChecker(Eng);
|
||||
RegisterReturnUndefChecker(Eng);
|
||||
RegisterUndefinedArraySubscriptChecker(Eng);
|
||||
RegisterUndefinedAssignmentChecker(Eng);
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace clang {
|
|||
class GRExprEngine;
|
||||
|
||||
void RegisterCStringChecker(GRExprEngine &Eng);
|
||||
void RegisterIdempotentOperationChecker(GRExprEngine &Eng);
|
||||
void RegisterMallocChecker(GRExprEngine &Eng);
|
||||
void RegisterPthreadLockChecker(GRExprEngine &Eng);
|
||||
void RegisterStreamChecker(GRExprEngine &Eng);
|
||||
|
|
|
@ -30,7 +30,6 @@ void RegisterCastSizeChecker(GRExprEngine &Eng);
|
|||
void RegisterDereferenceChecker(GRExprEngine &Eng);
|
||||
void RegisterDivZeroChecker(GRExprEngine &Eng);
|
||||
void RegisterFixedAddressChecker(GRExprEngine &Eng);
|
||||
void RegisterIdempotentOperationChecker(GRExprEngine &Eng);
|
||||
void RegisterNoReturnFunctionChecker(GRExprEngine &Eng);
|
||||
void RegisterPointerArithChecker(GRExprEngine &Eng);
|
||||
void RegisterPointerSubChecker(GRExprEngine &Eng);
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
// - Handle mixed assumptions (which assumptions can belong together?)
|
||||
// - Finer grained false positive control (levels)
|
||||
|
||||
#include "GRExprEngineInternalChecks.h"
|
||||
#include "GRExprEngineExperimentalChecks.h"
|
||||
#include "clang/Checker/BugReporter/BugType.h"
|
||||
#include "clang/Checker/PathSensitive/CheckerHelpers.h"
|
||||
#include "clang/Checker/PathSensitive/CheckerVisitor.h"
|
||||
|
|
|
@ -112,6 +112,8 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,
|
|||
Res.push_back("-analyzer-experimental-checks");
|
||||
if (Opts.EnableExperimentalInternalChecks)
|
||||
Res.push_back("-analyzer-experimental-internal-checks");
|
||||
if (Opts.IdempotentOps)
|
||||
Res.push_back("-analyzer-check-idempotent-operations");
|
||||
}
|
||||
|
||||
static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
|
||||
|
@ -794,6 +796,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
|||
Opts.MaxNodes = Args.getLastArgIntValue(OPT_analyzer_max_nodes, 150000,Diags);
|
||||
Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 3, Diags);
|
||||
Opts.InlineCall = Args.hasArg(OPT_analyzer_inline_call);
|
||||
Opts.IdempotentOps = Args.hasArg(OPT_analysis_WarnIdempotentOps);
|
||||
}
|
||||
|
||||
static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -verify -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -verify -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-check-idempotent-operations -verify %s
|
||||
|
||||
// Basic tests
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store=region -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store=region -analyzer-check-idempotent-operations -verify %s
|
||||
|
||||
struct s {
|
||||
int data;
|
||||
|
|
Loading…
Reference in New Issue