Merge ZeroSizedVLAChecker and UndefSizedVLAChecker.
llvm-svn: 85996
This commit is contained in:
parent
cd72c7b2b6
commit
259d46407a
|
@ -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);
|
||||
};
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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<VariableArrayType>(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;
|
||||
}
|
|
@ -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<VariableArrayType>(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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue