From c7ffd35cb720fcbf701af58ceba720eb3de0b3d6 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 26 Jan 2011 01:26:50 +0000 Subject: [PATCH] [analyzer] Enable the self-init checker under command-line option '-analyzer-check-objc-self-init' which by default is enabled by the driver for '--analyze'. llvm-svn: 124266 --- clang/include/clang/Driver/CC1Options.td | 2 ++ clang/include/clang/Frontend/AnalyzerOptions.h | 2 ++ clang/lib/Driver/Tools.cpp | 1 + clang/lib/Frontend/CompilerInvocation.cpp | 3 +++ clang/lib/StaticAnalyzer/Checkers/AnalysisConsumer.cpp | 3 +++ clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp | 1 - clang/test/Analysis/self-init.m | 2 +- 7 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index d36e45d1d19d..12800a8e8098 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -64,6 +64,8 @@ def analysis_WarnObjCUnusedIvars : Flag<"-analyzer-check-objc-unused-ivars">, HelpText<"Warn about private ivars that are never used">; def analysis_ObjCMemChecker : Flag<"-analyzer-check-objc-mem">, HelpText<"Run the [Core] Foundation reference count checker">; +def analysis_WarnObjCSelfInit : Flag<"-analyzer-check-objc-self-init">, + HelpText<"Warn about missing initialization of 'self' in an initializer">; 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">, diff --git a/clang/include/clang/Frontend/AnalyzerOptions.h b/clang/include/clang/Frontend/AnalyzerOptions.h index 8915cc59e4b5..8704fff68735 100644 --- a/clang/include/clang/Frontend/AnalyzerOptions.h +++ b/clang/include/clang/Frontend/AnalyzerOptions.h @@ -68,6 +68,7 @@ public: unsigned AnalyzerStats : 1; unsigned EagerlyAssume : 1; unsigned IdempotentOps : 1; + unsigned ObjCSelfInitCheck : 1; unsigned BufferOverflows : 1; unsigned PurgeDead : 1; unsigned TrimGraph : 1; @@ -91,6 +92,7 @@ public: AnalyzerStats = 0; EagerlyAssume = 0; IdempotentOps = 0; + ObjCSelfInitCheck = 0; BufferOverflows = 0; PurgeDead = 1; TrimGraph = 0; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index e245f7887092..90ed5d45ae04 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -910,6 +910,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (types::isObjC(InputType)) { CmdArgs.push_back("-analyzer-check-objc-methodsigs"); CmdArgs.push_back("-analyzer-check-objc-unused-ivars"); + CmdArgs.push_back("-analyzer-check-objc-self-init"); // Do not enable the missing -dealloc check. // '-analyzer-check-objc-missing-dealloc', } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c3f3dbd1f934..28cae64bff23 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -118,6 +118,8 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, Res.push_back("-analyzer-experimental-internal-checks"); if (Opts.IdempotentOps) Res.push_back("-analyzer-check-idempotent-operations"); + if (Opts.ObjCSelfInitCheck) + Res.push_back("-analyzer-check-objc-self-init"); if (Opts.BufferOverflows) Res.push_back("-analyzer-check-buffer-overflows"); } @@ -868,6 +870,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 4, Diags); Opts.InlineCall = Args.hasArg(OPT_analyzer_inline_call); Opts.IdempotentOps = Args.hasArg(OPT_analysis_WarnIdempotentOps); + Opts.ObjCSelfInitCheck = Args.hasArg(OPT_analysis_WarnObjCSelfInit); Opts.BufferOverflows = Args.hasArg(OPT_analysis_WarnBufferOverflows); } diff --git a/clang/lib/StaticAnalyzer/Checkers/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Checkers/AnalysisConsumer.cpp index ae8732a857ba..9190e2d75075 100644 --- a/clang/lib/StaticAnalyzer/Checkers/AnalysisConsumer.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/AnalysisConsumer.cpp @@ -357,6 +357,9 @@ static void ActionExprEngine(AnalysisConsumer &C, AnalysisManager& mgr, if (C.Opts.EnableExperimentalChecks) RegisterExperimentalChecks(Eng); + if (C.Opts.ObjCSelfInitCheck && isa(D)) + registerObjCSelfInitChecker(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 diff --git a/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp index f311bea87787..8ad094b1d3b8 100644 --- a/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ExprEngine.cpp @@ -309,7 +309,6 @@ static void RegisterInternalChecks(ExprEngine &Eng) { RegisterUndefResultChecker(Eng); RegisterStackAddrLeakChecker(Eng); RegisterObjCAtSyncChecker(Eng); - registerObjCSelfInitChecker(Eng); // This is not a checker yet. RegisterNoReturnFunctionChecker(Eng); diff --git a/clang/test/Analysis/self-init.m b/clang/test/Analysis/self-init.m index 0be8285c31a6..1e16e41d7a9a 100644 --- a/clang/test/Analysis/self-init.m +++ b/clang/test/Analysis/self-init.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem %s -verify +// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-check-objc-self-init %s -verify @class NSZone, NSCoder; @protocol NSObject