FixedAddressChecker.cpp revision 6f42b62b6194f53bcbc349f5d17388e1936535d7
1//=== FixedAddressChecker.cpp - Fixed address usage checker ----*- 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 files defines FixedAddressChecker, a builtin checker that checks for 11// assignment of a fixed address to a pointer. 12// This check corresponds to CWE-587. 13// 14//===----------------------------------------------------------------------===// 15 16#include "ClangSACheckers.h" 17#include "clang/StaticAnalyzer/Core/Checker.h" 18#include "clang/StaticAnalyzer/Core/CheckerManager.h" 19#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" 20#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" 21 22using namespace clang; 23using namespace ento; 24 25namespace { 26class FixedAddressChecker 27 : public Checker< check::PreStmt<BinaryOperator> > { 28 mutable OwningPtr<BuiltinBug> BT; 29 30public: 31 void checkPreStmt(const BinaryOperator *B, CheckerContext &C) const; 32}; 33} 34 35void FixedAddressChecker::checkPreStmt(const BinaryOperator *B, 36 CheckerContext &C) const { 37 // Using a fixed address is not portable because that address will probably 38 // not be valid in all environments or platforms. 39 40 if (B->getOpcode() != BO_Assign) 41 return; 42 43 QualType T = B->getType(); 44 if (!T->isPointerType()) 45 return; 46 47 ProgramStateRef state = C.getState(); 48 SVal RV = state->getSVal(B->getRHS(), C.getLocationContext()); 49 50 if (!RV.isConstant() || RV.isZeroConstant()) 51 return; 52 53 if (ExplodedNode *N = C.addTransition()) { 54 if (!BT) 55 BT.reset(new BuiltinBug("Use fixed address", 56 "Using a fixed address is not portable because that " 57 "address will probably not be valid in all " 58 "environments or platforms.")); 59 BugReport *R = new BugReport(*BT, BT->getDescription(), N); 60 R->addRange(B->getRHS()->getSourceRange()); 61 C.EmitReport(R); 62 } 63} 64 65void ento::registerFixedAddressChecker(CheckerManager &mgr) { 66 mgr.registerChecker<FixedAddressChecker>(); 67} 68