UndefinedArraySubscriptChecker.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //===--- 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 ExprEngine
  11. // that performs checks for undefined array subscripts.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "InternalChecks.h"
  15. #include "clang/StaticAnalyzer/BugReporter/BugType.h"
  16. #include "clang/StaticAnalyzer/PathSensitive/CheckerVisitor.h"
  17. using namespace clang;
  18. using namespace ento;
  19. namespace {
  20. class UndefinedArraySubscriptChecker
  21. : public CheckerVisitor<UndefinedArraySubscriptChecker> {
  22. BugType *BT;
  23. public:
  24. UndefinedArraySubscriptChecker() : BT(0) {}
  25. static void *getTag() {
  26. static int x = 0;
  27. return &x;
  28. }
  29. void PreVisitArraySubscriptExpr(CheckerContext &C,
  30. const ArraySubscriptExpr *A);
  31. };
  32. } // end anonymous namespace
  33. void ento::RegisterUndefinedArraySubscriptChecker(ExprEngine &Eng) {
  34. Eng.registerCheck(new UndefinedArraySubscriptChecker());
  35. }
  36. void
  37. UndefinedArraySubscriptChecker::PreVisitArraySubscriptExpr(CheckerContext &C,
  38. const ArraySubscriptExpr *A) {
  39. if (C.getState()->getSVal(A->getIdx()).isUndef()) {
  40. if (ExplodedNode *N = C.generateSink()) {
  41. if (!BT)
  42. BT = new BuiltinBug("Array subscript is undefined");
  43. // Generate a report for this bug.
  44. EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName(), N);
  45. R->addRange(A->getIdx()->getSourceRange());
  46. R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue,
  47. A->getIdx());
  48. C.EmitReport(R);
  49. }
  50. }
  51. }