aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/UndefinedArgChecker.cpp
blob: a229f55ff6d9e0c1f06fa37614cbbdaa688a956d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//===--- UndefinedArgChecker.h - Undefined arguments checker ----*- C++ -*--==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This defines BadCallChecker, a builtin check in GRExprEngine that performs
// checks for undefined arguments.
//
//===----------------------------------------------------------------------===//

#include "clang/Analysis/PathSensitive/Checkers/UndefinedArgChecker.h"
#include "clang/Analysis/PathSensitive/BugReporter.h"

using namespace clang;

void *UndefinedArgChecker::getTag() {
  static int x = 0;
  return &x;
}

void UndefinedArgChecker::PreVisitCallExpr(CheckerContext &C, 
                                           const CallExpr *CE){
  for (CallExpr::const_arg_iterator I = CE->arg_begin(), E = CE->arg_end();
       I != E; ++I) {
    if (C.getState()->getSVal(*I).isUndef()) {
      if (ExplodedNode *N = C.GenerateNode(CE, true)) {
        if (!BT)
          BT = new BugType("Pass-by-value argument in function call is "
                           "undefined", "Logic error");
        // Generate a report for this bug.
        EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName().c_str(),
                                                     N);
        R->addRange((*I)->getSourceRange());
        R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, *I);
        C.EmitReport(R);
      }
    }
  }
}