mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-29 08:19:01 -04:00

1) Create a header file to expose the predefined visitors. And move the parent(BugReporterVisitor) there as well. 2) Remove the registerXXXVisitor functions - the Visitor constructors/getters can be used now to create the object. One exception is registerVarDeclsLastStore(), which registers more then one visitor, so make it static member of FindLastStoreBRVisitor. 3) Modify all the checkers to use the new API. llvm-svn: 138126
55 lines
1.9 KiB
C++
55 lines
1.9 KiB
C++
//===--- UndefinedArraySubscriptChecker.h ----------------------*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This defines UndefinedArraySubscriptChecker, a builtin check in ExprEngine
|
|
// that performs checks for undefined array subscripts.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ClangSACheckers.h"
|
|
#include "clang/StaticAnalyzer/Core/Checker.h"
|
|
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
|
|
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
|
|
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
|
|
|
|
using namespace clang;
|
|
using namespace ento;
|
|
|
|
namespace {
|
|
class UndefinedArraySubscriptChecker
|
|
: public Checker< check::PreStmt<ArraySubscriptExpr> > {
|
|
mutable llvm::OwningPtr<BugType> BT;
|
|
|
|
public:
|
|
void checkPreStmt(const ArraySubscriptExpr *A, CheckerContext &C) const;
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
void
|
|
UndefinedArraySubscriptChecker::checkPreStmt(const ArraySubscriptExpr *A,
|
|
CheckerContext &C) const {
|
|
if (C.getState()->getSVal(A->getIdx()).isUndef()) {
|
|
if (ExplodedNode *N = C.generateSink()) {
|
|
if (!BT)
|
|
BT.reset(new BuiltinBug("Array subscript is undefined"));
|
|
|
|
// Generate a report for this bug.
|
|
BugReport *R = new BugReport(*BT, BT->getName(), N);
|
|
R->addRange(A->getIdx()->getSourceRange());
|
|
R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
|
|
A->getIdx()));
|
|
C.EmitReport(R);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ento::registerUndefinedArraySubscriptChecker(CheckerManager &mgr) {
|
|
mgr.registerChecker<UndefinedArraySubscriptChecker>();
|
|
}
|