From: Zhongxing Xu Date: Wed, 4 Nov 2009 01:43:07 +0000 (+0000) Subject: Merge ZeroSizedVLAChecker and UndefSizedVLAChecker. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=05a2338f7ba1c8a0136e120502f80a38cf0e9fd3;p=clang Merge ZeroSizedVLAChecker and UndefSizedVLAChecker. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85996 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/Checkers/UndefSizedVLAChecker.h b/include/clang/Analysis/PathSensitive/Checkers/UndefSizedVLAChecker.h deleted file mode 100644 index 9d4507cb0c..0000000000 --- a/include/clang/Analysis/PathSensitive/Checkers/UndefSizedVLAChecker.h +++ /dev/null @@ -1,29 +0,0 @@ -//=== UndefSizedVLAChecker.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 UndefSizedVLAChecker, a builtin check in GRExprEngine that -// performs checks for declaration of VLA of undefined size. -// -//===----------------------------------------------------------------------===// - -#include "clang/Analysis/PathSensitive/Checker.h" - -namespace clang { - -class UndefSizedVLAChecker : public Checker { - BugType *BT; - -public: - UndefSizedVLAChecker() : BT(0) {} - static void *getTag(); - ExplodedNode *CheckType(QualType T, ExplodedNode *Pred, - const GRState *state, Stmt *S, GRExprEngine &Eng); -}; - -} diff --git a/include/clang/Analysis/PathSensitive/Checkers/ZeroSizedVLAChecker.h b/include/clang/Analysis/PathSensitive/Checkers/VLASizeChecker.h similarity index 60% rename from include/clang/Analysis/PathSensitive/Checkers/ZeroSizedVLAChecker.h rename to include/clang/Analysis/PathSensitive/Checkers/VLASizeChecker.h index 4d3be31acf..b339b3d301 100644 --- a/include/clang/Analysis/PathSensitive/Checkers/ZeroSizedVLAChecker.h +++ b/include/clang/Analysis/PathSensitive/Checkers/VLASizeChecker.h @@ -1,4 +1,4 @@ -//=== ZeroSizedVLAChecker.cpp - Undefined dereference checker ---*- C++ -*-===// +//=== VLASizeChecker.h - Undefined dereference checker ----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// // -// This defines ZeorSizedVLAChecker, a builtin check in GRExprEngine that -// performs checks for declaration of VLA of zero size. +// This defines two VLASizeCheckers, a builtin check in GRExprEngine that +// performs checks for declaration of VLA of undefined or zero size. // //===----------------------------------------------------------------------===// @@ -16,6 +16,16 @@ namespace clang { +class UndefSizedVLAChecker : public Checker { + BugType *BT; + +public: + UndefSizedVLAChecker() : BT(0) {} + static void *getTag(); + ExplodedNode *CheckType(QualType T, ExplodedNode *Pred, + const GRState *state, Stmt *S, GRExprEngine &Eng); +}; + class ZeroSizedVLAChecker : public Checker { BugType *BT; diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt index 9661335a1e..ce34f1b3d7 100644 --- a/lib/Analysis/CMakeLists.txt +++ b/lib/Analysis/CMakeLists.txt @@ -42,11 +42,10 @@ add_clang_library(clangAnalysis SimpleSValuator.cpp Store.cpp SymbolManager.cpp - UndefSizedVLAChecker.cpp UndefinedArgChecker.cpp UninitializedValues.cpp ValueManager.cpp - ZeroSizedVLAChecker.cpp + VLASizeChecker.cpp ) add_dependencies(clangAnalysis ClangDiagnosticAnalysis) diff --git a/lib/Analysis/GRExprEngineInternalChecks.cpp b/lib/Analysis/GRExprEngineInternalChecks.cpp index 23ef2885a4..e0112ee984 100644 --- a/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -20,8 +20,7 @@ #include "clang/Analysis/PathSensitive/Checkers/BadCallChecker.h" #include "clang/Analysis/PathSensitive/Checkers/UndefinedArgChecker.h" #include "clang/Analysis/PathSensitive/Checkers/AttrNonNullChecker.h" -#include "clang/Analysis/PathSensitive/Checkers/UndefSizedVLAChecker.h" -#include "clang/Analysis/PathSensitive/Checkers/ZeroSizedVLAChecker.h" +#include "clang/Analysis/PathSensitive/Checkers/VLASizeChecker.h" #include "clang/Analysis/PathDiagnostic.h" #include "clang/Basic/SourceManager.h" #include "llvm/Support/Compiler.h" diff --git a/lib/Analysis/UndefSizedVLAChecker.cpp b/lib/Analysis/UndefSizedVLAChecker.cpp deleted file mode 100644 index e51e10e3aa..0000000000 --- a/lib/Analysis/UndefSizedVLAChecker.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//=== UndefSizedVLAChecker.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 UndefSizedVLAChecker, a builtin check in GRExprEngine that -// performs checks for declaration of VLA of undefined size. -// -//===----------------------------------------------------------------------===// - -#include "clang/Analysis/PathSensitive/Checkers/UndefSizedVLAChecker.h" -#include "clang/Analysis/PathSensitive/GRExprEngine.h" -#include "clang/Analysis/PathSensitive/BugReporter.h" - -using namespace clang; - -void *UndefSizedVLAChecker::getTag() { - static int x = 0; - return &x; -} - -ExplodedNode *UndefSizedVLAChecker::CheckType(QualType T, ExplodedNode *Pred, - const GRState *state, - Stmt *S, GRExprEngine &Eng) { - GRStmtNodeBuilder &Builder = Eng.getBuilder(); - BugReporter &BR = Eng.getBugReporter(); - - if (VariableArrayType* VLA = dyn_cast(T)) { - // FIXME: Handle multi-dimensional VLAs. - Expr* SE = VLA->getSizeExpr(); - SVal Size_untested = state->getSVal(SE); - - if (Size_untested.isUndef()) { - if (ExplodedNode* N = Builder.generateNode(S, state, Pred)) { - N->markAsSink(); - if (!BT) - BT = new BugType("Declare variable-length array (VLA) of undefined " - "size", "Logic error"); - - EnhancedBugReport *R = - new EnhancedBugReport(*BT, BT->getName().c_str(), N); - R->addRange(SE->getSourceRange()); - R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, SE); - BR.EmitReport(R); - } - return 0; - } - } - return Pred; -} diff --git a/lib/Analysis/ZeroSizedVLAChecker.cpp b/lib/Analysis/VLASizeChecker.cpp similarity index 58% rename from lib/Analysis/ZeroSizedVLAChecker.cpp rename to lib/Analysis/VLASizeChecker.cpp index 8984a5f390..76e4477449 100644 --- a/lib/Analysis/ZeroSizedVLAChecker.cpp +++ b/lib/Analysis/VLASizeChecker.cpp @@ -1,4 +1,4 @@ -//=== ZeroSizedVLAChecker.cpp - Undefined dereference checker ---*- C++ -*-===// +//=== VLASizeChecker.cpp - Undefined dereference checker --------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,17 +7,52 @@ // //===----------------------------------------------------------------------===// // -// This defines ZeorSizedVLAChecker, a builtin check in GRExprEngine that -// performs checks for declaration of VLA of zero size. +// This defines two VLASizeCheckers, a builtin check in GRExprEngine that +// performs checks for declaration of VLA of undefined or zero size. // //===----------------------------------------------------------------------===// -#include "clang/Analysis/PathSensitive/Checkers/ZeroSizedVLAChecker.h" +#include "clang/Analysis/PathSensitive/Checkers/VLASizeChecker.h" #include "clang/Analysis/PathSensitive/GRExprEngine.h" #include "clang/Analysis/PathSensitive/BugReporter.h" using namespace clang; +void *UndefSizedVLAChecker::getTag() { + static int x = 0; + return &x; +} + +ExplodedNode *UndefSizedVLAChecker::CheckType(QualType T, ExplodedNode *Pred, + const GRState *state, + Stmt *S, GRExprEngine &Eng) { + GRStmtNodeBuilder &Builder = Eng.getBuilder(); + BugReporter &BR = Eng.getBugReporter(); + + if (VariableArrayType* VLA = dyn_cast(T)) { + // FIXME: Handle multi-dimensional VLAs. + Expr* SE = VLA->getSizeExpr(); + SVal Size_untested = state->getSVal(SE); + + if (Size_untested.isUndef()) { + if (ExplodedNode* N = Builder.generateNode(S, state, Pred)) { + N->markAsSink(); + if (!BT) + BT = new BugType("Declare variable-length array (VLA) of undefined " + "size", "Logic error"); + + EnhancedBugReport *R = + new EnhancedBugReport(*BT, BT->getName().c_str(), N); + R->addRange(SE->getSourceRange()); + R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, SE); + BR.EmitReport(R); + } + return 0; + } + } + return Pred; +} + void *ZeroSizedVLAChecker::getTag() { static int x; return &x; @@ -64,3 +99,4 @@ ExplodedNode *ZeroSizedVLAChecker::CheckType(QualType T, ExplodedNode *Pred, else return Pred; } +