1 //== ReturnUndefChecker.cpp -------------------------------------*- C++ -*--==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines ReturnUndefChecker, which is a path-sensitive
11 // check which looks for undefined or garbage values being returned to the
14 //===----------------------------------------------------------------------===//
16 #include "GRExprEngineInternalChecks.h"
17 #include "clang/Checker/PathSensitive/GRExprEngine.h"
18 #include "clang/Checker/BugReporter/BugReporter.h"
19 #include "clang/Checker/PathSensitive/CheckerVisitor.h"
20 #include "llvm/ADT/SmallString.h"
22 using namespace clang;
25 class ReturnUndefChecker :
26 public CheckerVisitor<ReturnUndefChecker> {
29 ReturnUndefChecker() : BT(0) {}
30 static void *getTag();
31 void PreVisitReturnStmt(CheckerContext &C, const ReturnStmt *RS);
35 void clang::RegisterReturnUndefChecker(GRExprEngine &Eng) {
36 Eng.registerCheck(new ReturnUndefChecker());
39 void *ReturnUndefChecker::getTag() {
40 static int x = 0; return &x;
43 void ReturnUndefChecker::PreVisitReturnStmt(CheckerContext &C,
44 const ReturnStmt *RS) {
46 const Expr *RetE = RS->getRetValue();
50 if (!C.getState()->getSVal(RetE).isUndef())
53 ExplodedNode *N = C.GenerateSink();
59 BT = new BuiltinBug("Garbage return value",
60 "Undefined or garbage value returned to caller");
62 EnhancedBugReport *report =
63 new EnhancedBugReport(*BT, BT->getDescription(), N);
65 report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, RetE);