blob: 0297c4eb14e9b33dc269f5314cb2b7898b4fef79 [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//
Argyrios Kyrtzidisd2592a32010-12-22 18:53:44 +000010// This defines UndefinedArraySubscriptChecker, a builtin check in ExprEngine
Zhongxing Xud6944852009-11-11 13:42:54 +000011// that performs checks for undefined array subscripts.
12//
13//===----------------------------------------------------------------------===//
14
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000015#include "ClangSACheckers.h"
Argyrios Kyrtzidisec8605f2011-03-01 01:16:21 +000016#include "clang/StaticAnalyzer/Core/Checker.h"
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000017#include "clang/StaticAnalyzer/Core/CheckerManager.h"
18#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
Ted Kremenek9b663712011-02-10 01:03:03 +000019#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
Zhongxing Xud6944852009-11-11 13:42:54 +000020
21using namespace clang;
Ted Kremenek9ef65372010-12-23 07:20:52 +000022using namespace ento;
Zhongxing Xud6944852009-11-11 13:42:54 +000023
24namespace {
Kovarththanan Rajaratnamba5fb5a2009-11-28 06:07:30 +000025class UndefinedArraySubscriptChecker
Argyrios Kyrtzidisec8605f2011-03-01 01:16:21 +000026 : public Checker< check::PreStmt<ArraySubscriptExpr> > {
Dylan Noblesmith6f42b622012-02-05 02:12:40 +000027 mutable OwningPtr<BugType> BT;
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000028
Zhongxing Xud6944852009-11-11 13:42:54 +000029public:
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000030 void checkPreStmt(const ArraySubscriptExpr *A, CheckerContext &C) const;
Zhongxing Xud6944852009-11-11 13:42:54 +000031};
32} // end anonymous namespace
33
Zhongxing Xud6944852009-11-11 13:42:54 +000034void
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000035UndefinedArraySubscriptChecker::checkPreStmt(const ArraySubscriptExpr *A,
36 CheckerContext &C) const {
Ted Kremenek5eca4822012-01-06 22:09:28 +000037 if (C.getState()->getSVal(A->getIdx(), C.getLocationContext()).isUndef()) {
Ted Kremenekd048c6e2010-12-20 21:19:09 +000038 if (ExplodedNode *N = C.generateSink()) {
Zhongxing Xud6944852009-11-11 13:42:54 +000039 if (!BT)
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000040 BT.reset(new BuiltinBug("Array subscript is undefined"));
Zhongxing Xud6944852009-11-11 13:42:54 +000041
42 // Generate a report for this bug.
Anna Zakse172e8b2011-08-17 23:00:25 +000043 BugReport *R = new BugReport(*BT, BT->getName(), N);
Zhongxing Xud6944852009-11-11 13:42:54 +000044 R->addRange(A->getIdx()->getSourceRange());
Anna Zaks50bbc162011-08-19 22:33:38 +000045 R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
Ted Kremenek76aadc32012-03-09 01:13:14 +000046 A->getIdx(),
47 R));
Zhongxing Xud6944852009-11-11 13:42:54 +000048 C.EmitReport(R);
49 }
50 }
51}
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000052
53void ento::registerUndefinedArraySubscriptChecker(CheckerManager &mgr) {
54 mgr.registerChecker<UndefinedArraySubscriptChecker>();
55}