зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
e584b6538a
Коммит
dc998c1b90
|
@ -7,13 +7,14 @@
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// This defines NullDerefChecker, a builtin check in GRExprEngine that performs
|
// This defines NullDerefChecker and UndefDerefChecker, two builtin checks
|
||||||
// checks for null pointers at loads and stores.
|
// in GRExprEngine that check for null and undefined pointers at loads
|
||||||
|
// and stores.
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#ifndef LLVM_CLANG_NULLDEREFCHECKER
|
#ifndef LLVM_CLANG_DEREFCHECKER
|
||||||
#define LLVM_CLANG_NULLDEREFCHECKER
|
#define LLVM_CLANG_DEREFCHECKER
|
||||||
|
|
||||||
#include "clang/Analysis/PathSensitive/Checker.h"
|
#include "clang/Analysis/PathSensitive/Checker.h"
|
||||||
#include "clang/Analysis/PathSensitive/BugType.h"
|
#include "clang/Analysis/PathSensitive/BugType.h"
|
||||||
|
@ -37,5 +38,16 @@ public:
|
||||||
iterator implicit_nodes_end() { return ImplicitNullDerefNodes.end(); }
|
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
|
} // end clang namespace
|
||||||
#endif
|
#endif
|
|
@ -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();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -20,6 +20,7 @@ add_clang_library(clangAnalysis
|
||||||
CheckObjCInstMethSignature.cpp
|
CheckObjCInstMethSignature.cpp
|
||||||
CheckObjCUnusedIVars.cpp
|
CheckObjCUnusedIVars.cpp
|
||||||
CheckSecuritySyntaxOnly.cpp
|
CheckSecuritySyntaxOnly.cpp
|
||||||
|
DereferenceChecker.cpp
|
||||||
DivZeroChecker.cpp
|
DivZeroChecker.cpp
|
||||||
Environment.cpp
|
Environment.cpp
|
||||||
ExplodedGraph.cpp
|
ExplodedGraph.cpp
|
||||||
|
@ -32,7 +33,6 @@ add_clang_library(clangAnalysis
|
||||||
MemRegion.cpp
|
MemRegion.cpp
|
||||||
NSAutoreleasePoolChecker.cpp
|
NSAutoreleasePoolChecker.cpp
|
||||||
NSErrorChecker.cpp
|
NSErrorChecker.cpp
|
||||||
NullDerefChecker.cpp
|
|
||||||
PathDiagnostic.cpp
|
PathDiagnostic.cpp
|
||||||
RangeConstraintManager.cpp
|
RangeConstraintManager.cpp
|
||||||
RegionStore.cpp
|
RegionStore.cpp
|
||||||
|
@ -42,7 +42,6 @@ add_clang_library(clangAnalysis
|
||||||
SimpleSValuator.cpp
|
SimpleSValuator.cpp
|
||||||
Store.cpp
|
Store.cpp
|
||||||
SymbolManager.cpp
|
SymbolManager.cpp
|
||||||
UndefDerefChecker.cpp
|
|
||||||
UndefSizedVLAChecker.cpp
|
UndefSizedVLAChecker.cpp
|
||||||
UndefinedArgChecker.cpp
|
UndefinedArgChecker.cpp
|
||||||
UninitializedValues.cpp
|
UninitializedValues.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/GRExprEngine.h"
|
||||||
#include "clang/Analysis/PathSensitive/BugReporter.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,
|
return Builder.generateNode(S, NotNullState, Pred,
|
||||||
ProgramPoint::PostLocationChecksSucceedKind);
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
#include "clang/Analysis/PathSensitive/BugReporter.h"
|
#include "clang/Analysis/PathSensitive/BugReporter.h"
|
||||||
#include "clang/Analysis/PathSensitive/GRExprEngine.h"
|
#include "clang/Analysis/PathSensitive/GRExprEngine.h"
|
||||||
#include "clang/Analysis/PathSensitive/CheckerVisitor.h"
|
#include "clang/Analysis/PathSensitive/CheckerVisitor.h"
|
||||||
#include "clang/Analysis/PathSensitive/Checkers/NullDerefChecker.h"
|
#include "clang/Analysis/PathSensitive/Checkers/DereferenceChecker.h"
|
||||||
#include "clang/Analysis/PathSensitive/Checkers/UndefDerefChecker.h"
|
|
||||||
#include "clang/Analysis/PathSensitive/Checkers/DivZeroChecker.h"
|
#include "clang/Analysis/PathSensitive/Checkers/DivZeroChecker.h"
|
||||||
#include "clang/Analysis/PathSensitive/Checkers/BadCallChecker.h"
|
#include "clang/Analysis/PathSensitive/Checkers/BadCallChecker.h"
|
||||||
#include "clang/Analysis/PathSensitive/Checkers/UndefinedArgChecker.h"
|
#include "clang/Analysis/PathSensitive/Checkers/UndefinedArgChecker.h"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include "clang/Analysis/LocalCheckers.h"
|
#include "clang/Analysis/LocalCheckers.h"
|
||||||
#include "clang/Analysis/PathSensitive/BugReporter.h"
|
#include "clang/Analysis/PathSensitive/BugReporter.h"
|
||||||
#include "clang/Analysis/PathSensitive/GRExprEngine.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 "BasicObjCFoundationChecks.h"
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "clang/AST/DeclObjC.h"
|
#include "clang/AST/DeclObjC.h"
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче