blob: 148629e0093f010d3b904658f4b60463128ffbef [file] [log] [blame]
Zhongxing Xud6944852009-11-11 13:42:54 +00001//===--- UndefinedArraySubscriptChecker.h ----------------------*- C++ -*--===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This defines UndefinedArraySubscriptChecker, a builtin check in GRExprEngine
11// that performs checks for undefined array subscripts.
12//
13//===----------------------------------------------------------------------===//
14
Zhongxing Xud6944852009-11-11 13:42:54 +000015#include "GRExprEngineInternalChecks.h"
Benjamin Kramer5e2d2c22010-03-27 21:19:47 +000016#include "clang/Checker/BugReporter/BugType.h"
17#include "clang/Checker/PathSensitive/CheckerVisitor.h"
Zhongxing Xud6944852009-11-11 13:42:54 +000018
19using namespace clang;
20
21namespace {
Kovarththanan Rajaratnamba5fb5a2009-11-28 06:07:30 +000022class UndefinedArraySubscriptChecker
Zhongxing Xud6944852009-11-11 13:42:54 +000023 : public CheckerVisitor<UndefinedArraySubscriptChecker> {
24 BugType *BT;
25public:
26 UndefinedArraySubscriptChecker() : BT(0) {}
27 static void *getTag() {
28 static int x = 0;
29 return &x;
30 }
31 void PreVisitArraySubscriptExpr(CheckerContext &C,
32 const ArraySubscriptExpr *A);
33};
34} // end anonymous namespace
35
36void clang::RegisterUndefinedArraySubscriptChecker(GRExprEngine &Eng) {
37 Eng.registerCheck(new UndefinedArraySubscriptChecker());
38}
39
40void
41UndefinedArraySubscriptChecker::PreVisitArraySubscriptExpr(CheckerContext &C,
42 const ArraySubscriptExpr *A) {
Ted Kremenek13976632010-02-08 16:18:51 +000043 if (C.getState()->getSVal(A->getIdx()).isUndef()) {
Ted Kremenek19d67b52009-11-23 22:22:01 +000044 if (ExplodedNode *N = C.GenerateSink()) {
Zhongxing Xud6944852009-11-11 13:42:54 +000045 if (!BT)
46 BT = new BuiltinBug("Array subscript is undefined");
47
48 // Generate a report for this bug.
Benjamin Kramerd02e2322009-11-14 12:08:24 +000049 EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName(), N);
Zhongxing Xud6944852009-11-11 13:42:54 +000050 R->addRange(A->getIdx()->getSourceRange());
51 R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue,
52 A->getIdx());
53 C.EmitReport(R);
54 }
55 }
56}