Home | History | Annotate | Download | only in PathSensitive
      1 //== TaintManager.h - Managing taint --------------------------- -*- 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 file provides APIs for adding, removing, querying symbol taint.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_TAINTMANAGER_H
     15 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_TAINTMANAGER_H
     16 
     17 #include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
     18 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
     19 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
     20 #include "clang/StaticAnalyzer/Core/PathSensitive/TaintTag.h"
     21 #include "llvm/ADT/ImmutableMap.h"
     22 
     23 namespace clang {
     24 namespace ento {
     25 
     26 /// The GDM component containing the tainted root symbols. We lazily infer the
     27 /// taint of the dependent symbols. Currently, this is a map from a symbol to
     28 /// tag kind. TODO: Should support multiple tag kinds.
     29 // FIXME: This does not use the nice trait macros because it must be accessible
     30 // from multiple translation units.
     31 struct TaintMap {};
     32 typedef llvm::ImmutableMap<SymbolRef, TaintTagType> TaintMapImpl;
     33 template<> struct ProgramStateTrait<TaintMap>
     34     :  public ProgramStatePartialTrait<TaintMapImpl> {
     35   static void *GDMIndex() { static int index = 0; return &index; }
     36 };
     37 
     38 /// The GDM component mapping derived symbols' parent symbols to their
     39 /// underlying regions. This is used to efficiently check whether a symbol is
     40 /// tainted when it represents a sub-region of a tainted symbol.
     41 struct DerivedSymTaint {};
     42 typedef llvm::ImmutableMap<SymbolRef, TaintedSubRegions> DerivedSymTaintImpl;
     43 template<> struct ProgramStateTrait<DerivedSymTaint>
     44     :  public ProgramStatePartialTrait<DerivedSymTaintImpl> {
     45   static void *GDMIndex() { static int index; return &index; }
     46 };
     47 
     48 class TaintManager {
     49 
     50   TaintManager() {}
     51 };
     52 
     53 }
     54 }
     55 
     56 #endif
     57