From dc998c1b90a17d747ca2fb05e967779740747162 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 3 Nov 2009 18:41:06 +0000 Subject: [PATCH] Merge NullDerefChecker.[h,cpp] and UndefDerefChecker.[h,cpp]. They are essentially two parts of the same check. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85911 91177308-0d34-0410-b5e6-96231b3b80d8 --- ...ullDerefChecker.h => DereferenceChecker.h} | 20 +++++-- .../Checkers/UndefDerefChecker.h | 31 ----------- lib/Analysis/CMakeLists.txt | 3 +- ...erefChecker.cpp => DereferenceChecker.cpp} | 38 ++++++++++++- lib/Analysis/GRExprEngineInternalChecks.cpp | 3 +- lib/Analysis/NSErrorChecker.cpp | 2 +- lib/Analysis/UndefDerefChecker.cpp | 53 ------------------- 7 files changed, 56 insertions(+), 94 deletions(-) rename include/clang/Analysis/PathSensitive/Checkers/{NullDerefChecker.h => DereferenceChecker.h} (69%) delete mode 100644 include/clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h rename lib/Analysis/{NullDerefChecker.cpp => DereferenceChecker.cpp} (68%) delete mode 100644 lib/Analysis/UndefDerefChecker.cpp diff --git a/include/clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h b/include/clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h similarity index 69% rename from include/clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h rename to include/clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h index 6905d6834b..688cf64149 100644 --- a/include/clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h +++ b/include/clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// // -// This defines NullDerefChecker, a builtin check in GRExprEngine that performs -// checks for null pointers at loads and stores. +// This defines NullDerefChecker and UndefDerefChecker, two builtin checks +// in GRExprEngine that check for null and undefined pointers at loads +// and stores. // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_NULLDEREFCHECKER -#define LLVM_CLANG_NULLDEREFCHECKER +#ifndef LLVM_CLANG_DEREFCHECKER +#define LLVM_CLANG_DEREFCHECKER #include "clang/Analysis/PathSensitive/Checker.h" #include "clang/Analysis/PathSensitive/BugType.h" @@ -37,5 +38,16 @@ public: iterator implicit_nodes_end() { return ImplicitNullDerefNodes.end(); } }; +class UndefDerefChecker : public Checker { + BuiltinBug *BT; +public: + UndefDerefChecker() : BT(0) {} + + ExplodedNode *CheckLocation(const Stmt *S, ExplodedNode *Pred, + const GRState *state, SVal V, GRExprEngine &Eng); + + static void *getTag(); +}; + } // end clang namespace #endif diff --git a/include/clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h b/include/clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h deleted file mode 100644 index e5c346e534..0000000000 --- a/include/clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h +++ /dev/null @@ -1,31 +0,0 @@ -//== UndefDerefChecker.h - Undefined dereference checker --------*- C++ -*--==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This defines UndefDerefChecker, a builtin check in GRExprEngine that performs -// checks for defined pointers at loads and stores. -// -//===----------------------------------------------------------------------===// - -#include "clang/Analysis/PathSensitive/Checker.h" -#include "clang/Analysis/PathSensitive/BugType.h" - -namespace clang { - -class UndefDerefChecker : public Checker { - BuiltinBug *BT; -public: - UndefDerefChecker() : BT(0) {} - - ExplodedNode *CheckLocation(const Stmt *S, ExplodedNode *Pred, - const GRState *state, SVal V, GRExprEngine &Eng); - - static void *getTag(); -}; - -} diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt index 0e1d9f8cac..9661335a1e 100644 --- a/lib/Analysis/CMakeLists.txt +++ b/lib/Analysis/CMakeLists.txt @@ -20,6 +20,7 @@ add_clang_library(clangAnalysis CheckObjCInstMethSignature.cpp CheckObjCUnusedIVars.cpp CheckSecuritySyntaxOnly.cpp + DereferenceChecker.cpp DivZeroChecker.cpp Environment.cpp ExplodedGraph.cpp @@ -32,7 +33,6 @@ add_clang_library(clangAnalysis MemRegion.cpp NSAutoreleasePoolChecker.cpp NSErrorChecker.cpp - NullDerefChecker.cpp PathDiagnostic.cpp RangeConstraintManager.cpp RegionStore.cpp @@ -42,7 +42,6 @@ add_clang_library(clangAnalysis SimpleSValuator.cpp Store.cpp SymbolManager.cpp - UndefDerefChecker.cpp UndefSizedVLAChecker.cpp UndefinedArgChecker.cpp UninitializedValues.cpp diff --git a/lib/Analysis/NullDerefChecker.cpp b/lib/Analysis/DereferenceChecker.cpp similarity index 68% rename from lib/Analysis/NullDerefChecker.cpp rename to lib/Analysis/DereferenceChecker.cpp index ef7da61901..33c85d5074 100644 --- a/lib/Analysis/NullDerefChecker.cpp +++ b/lib/Analysis/DereferenceChecker.cpp @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h" +#include "clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h" #include "clang/Analysis/PathSensitive/GRExprEngine.h" #include "clang/Analysis/PathSensitive/BugReporter.h" @@ -74,3 +74,39 @@ ExplodedNode *NullDerefChecker::CheckLocation(const Stmt *S, ExplodedNode *Pred, return Builder.generateNode(S, NotNullState, Pred, ProgramPoint::PostLocationChecksSucceedKind); } + + +void *UndefDerefChecker::getTag() { + static int x = 0; + return &x; +} + +ExplodedNode *UndefDerefChecker::CheckLocation(const Stmt *S, + ExplodedNode *Pred, + const GRState *state, SVal V, + GRExprEngine &Eng) { + GRStmtNodeBuilder &Builder = Eng.getBuilder(); + BugReporter &BR = Eng.getBugReporter(); + + if (V.isUndef()) { + ExplodedNode *N = Builder.generateNode(S, state, Pred, + ProgramPoint::PostUndefLocationCheckFailedKind); + if (N) { + N->markAsSink(); + + if (!BT) + BT = new BuiltinBug(0, "Undefined dereference", + "Dereference of undefined pointer value"); + + EnhancedBugReport *R = + new EnhancedBugReport(*BT, BT->getDescription().c_str(), N); + R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, + bugreporter::GetDerefExpr(N)); + BR.EmitReport(R); + } + return 0; + } + + return Pred; +} + diff --git a/lib/Analysis/GRExprEngineInternalChecks.cpp b/lib/Analysis/GRExprEngineInternalChecks.cpp index 089d25d6cf..23ef2885a4 100644 --- a/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -15,8 +15,7 @@ #include "clang/Analysis/PathSensitive/BugReporter.h" #include "clang/Analysis/PathSensitive/GRExprEngine.h" #include "clang/Analysis/PathSensitive/CheckerVisitor.h" -#include "clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h" -#include "clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h" +#include "clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h" #include "clang/Analysis/PathSensitive/Checkers/DivZeroChecker.h" #include "clang/Analysis/PathSensitive/Checkers/BadCallChecker.h" #include "clang/Analysis/PathSensitive/Checkers/UndefinedArgChecker.h" diff --git a/lib/Analysis/NSErrorChecker.cpp b/lib/Analysis/NSErrorChecker.cpp index 2f6df23e08..307686ff57 100644 --- a/lib/Analysis/NSErrorChecker.cpp +++ b/lib/Analysis/NSErrorChecker.cpp @@ -18,7 +18,7 @@ #include "clang/Analysis/LocalCheckers.h" #include "clang/Analysis/PathSensitive/BugReporter.h" #include "clang/Analysis/PathSensitive/GRExprEngine.h" -#include "clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h" +#include "clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h" #include "BasicObjCFoundationChecks.h" #include "llvm/Support/Compiler.h" #include "clang/AST/DeclObjC.h" diff --git a/lib/Analysis/UndefDerefChecker.cpp b/lib/Analysis/UndefDerefChecker.cpp deleted file mode 100644 index da04826b7a..0000000000 --- a/lib/Analysis/UndefDerefChecker.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// UndefDerefChecker.cpp - Undefined dereference checker ----------*- C++ -*--// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This defines UndefDerefChecker, a builtin check in GRExprEngine that performs -// checks for defined pointers at loads and stores. -// -//===----------------------------------------------------------------------===// - -#include "clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h" -#include "clang/Analysis/PathSensitive/GRExprEngine.h" -#include "clang/Analysis/PathSensitive/BugReporter.h" - -using namespace clang; - -void *UndefDerefChecker::getTag() { - static int x = 0; - return &x; -} - -ExplodedNode *UndefDerefChecker::CheckLocation(const Stmt *S, - ExplodedNode *Pred, - const GRState *state, SVal V, - GRExprEngine &Eng) { - GRStmtNodeBuilder &Builder = Eng.getBuilder(); - BugReporter &BR = Eng.getBugReporter(); - - if (V.isUndef()) { - ExplodedNode *N = Builder.generateNode(S, state, Pred, - ProgramPoint::PostUndefLocationCheckFailedKind); - if (N) { - N->markAsSink(); - - if (!BT) - BT = new BuiltinBug(0, "Undefined dereference", - "Dereference of undefined pointer value"); - - EnhancedBugReport *R = - new EnhancedBugReport(*BT, BT->getDescription().c_str(), N); - R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, - bugreporter::GetDerefExpr(N)); - BR.EmitReport(R); - } - return 0; - } - - return Pred; -}