blob: f83d44449ef127f85df0ed5575af5d4c8f26deaa [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"
16#include "clang/StaticAnalyzer/Core/CheckerV2.h"
17#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 Kyrtzidiseb290ca2011-02-28 01:27:41 +000026 : public CheckerV2< check::PreStmt<ArraySubscriptExpr> > {
27 mutable llvm::OwningPtr<BugType> BT;
28
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 Kremenek13976632010-02-08 16:18:51 +000037 if (C.getState()->getSVal(A->getIdx()).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.
Benjamin Kramerd02e2322009-11-14 12:08:24 +000043 EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName(), N);
Zhongxing Xud6944852009-11-11 13:42:54 +000044 R->addRange(A->getIdx()->getSourceRange());
45 R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue,
46 A->getIdx());
47 C.EmitReport(R);
48 }
49 }
50}
Argyrios Kyrtzidiseb290ca2011-02-28 01:27:41 +000051
52void ento::registerUndefinedArraySubscriptChecker(CheckerManager &mgr) {
53 mgr.registerChecker<UndefinedArraySubscriptChecker>();
54}