1 //===--- UndefinedArraySubscriptChecker.h ----------------------*- C++ -*--===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This defines UndefinedArraySubscriptChecker, a builtin check in GRExprEngine
11 // that performs checks for undefined array subscripts.
13 //===----------------------------------------------------------------------===//
15 #include "clang/Checker/PathSensitive/CheckerVisitor.h"
16 #include "clang/Checker/BugReporter/BugReporter.h"
17 #include "GRExprEngineInternalChecks.h"
19 using namespace clang;
22 class UndefinedArraySubscriptChecker
23 : public CheckerVisitor<UndefinedArraySubscriptChecker> {
26 UndefinedArraySubscriptChecker() : BT(0) {}
27 static void *getTag() {
31 void PreVisitArraySubscriptExpr(CheckerContext &C,
32 const ArraySubscriptExpr *A);
34 } // end anonymous namespace
36 void clang::RegisterUndefinedArraySubscriptChecker(GRExprEngine &Eng) {
37 Eng.registerCheck(new UndefinedArraySubscriptChecker());
41 UndefinedArraySubscriptChecker::PreVisitArraySubscriptExpr(CheckerContext &C,
42 const ArraySubscriptExpr *A) {
43 if (C.getState()->getSVal(A->getIdx()).isUndef()) {
44 if (ExplodedNode *N = C.GenerateSink()) {
46 BT = new BuiltinBug("Array subscript is undefined");
48 // Generate a report for this bug.
49 EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName(), N);
50 R->addRange(A->getIdx()->getSourceRange());
51 R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue,