CheckerHelpers.cpp revision 9ef6537a894c33003359b1f9b9676e9178e028b7
11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===---- CheckerHelpers.cpp - Helper functions for checkers ----*- C++ -*-===// 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The LLVM Compiler Infrastructure 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file is distributed under the University of Illinois Open Source 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// License. See LICENSE.TXT for details. 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===// 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file defines several static functions for use in checkers. 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===// 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "clang/GR/PathSensitive/CheckerHelpers.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "clang/AST/Expr.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Recursively find any substatements containing macros 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool clang::ento::containsMacro(const Stmt *S) { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (S->getLocStart().isMacroID()) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (S->getLocEnd().isMacroID()) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++I) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (const Stmt *child = *I) 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (containsMacro(child)) 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Recursively find any substatements containing enum constants 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool clang::ento::containsEnum(const Stmt *S) { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(S); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (DR && isa<EnumConstantDecl>(DR->getDecl())) 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++I) 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (const Stmt *child = *I) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (containsEnum(child)) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Recursively find any substatements containing static vars 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool clang::ento::containsStaticLocal(const Stmt *S) { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(S); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (DR) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (VD->isStaticLocal()) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 58 59 for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); 60 ++I) 61 if (const Stmt *child = *I) 62 if (containsStaticLocal(child)) 63 return true; 64 65 return false; 66} 67 68// Recursively find any substatements containing __builtin_offsetof 69bool clang::ento::containsBuiltinOffsetOf(const Stmt *S) { 70 if (isa<OffsetOfExpr>(S)) 71 return true; 72 73 for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); 74 ++I) 75 if (const Stmt *child = *I) 76 if (containsBuiltinOffsetOf(child)) 77 return true; 78 79 return false; 80} 81