@@ -38,8 +38,6 @@ using namespace clang;
38
38
using namespace ento ;
39
39
using namespace taint ;
40
40
41
- using llvm::ImmutableSet;
42
-
43
41
namespace {
44
42
45
43
class GenericTaintChecker ;
@@ -436,9 +434,7 @@ template <> struct ScalarEnumerationTraits<TaintConfiguration::VariadicType> {
436
434
// / to the call post-visit. The values are signed integers, which are either
437
435
// / ReturnValueIndex, or indexes of the pointer/reference argument, which
438
436
// / points to data, which should be tainted on return.
439
- REGISTER_MAP_WITH_PROGRAMSTATE (TaintArgsOnPostVisit, const LocationContext *,
440
- ImmutableSet<ArgIdxTy>)
441
- REGISTER_SET_FACTORY_WITH_PROGRAMSTATE(ArgIdxFactory, ArgIdxTy)
437
+ REGISTER_SET_WITH_PROGRAMSTATE (TaintArgsOnPostVisit, ArgIdxTy)
442
438
443
439
void GenericTaintRuleParser::validateArgVector(const std::string &Option,
444
440
const ArgVecTy &Args) const {
@@ -689,26 +685,22 @@ void GenericTaintChecker::checkPostCall(const CallEvent &Call,
689
685
// Set the marked values as tainted. The return value only accessible from
690
686
// checkPostStmt.
691
687
ProgramStateRef State = C.getState ();
692
- const StackFrameContext *CurrentFrame = C.getStackFrame ();
693
688
694
689
// Depending on what was tainted at pre-visit, we determined a set of
695
690
// arguments which should be tainted after the function returns. These are
696
691
// stored in the state as TaintArgsOnPostVisit set.
697
- TaintArgsOnPostVisitTy TaintArgsMap = State->get <TaintArgsOnPostVisit>();
698
-
699
- const ImmutableSet<ArgIdxTy> *TaintArgs = TaintArgsMap.lookup (CurrentFrame);
700
- if (!TaintArgs)
692
+ TaintArgsOnPostVisitTy TaintArgs = State->get <TaintArgsOnPostVisit>();
693
+ if (TaintArgs.isEmpty ())
701
694
return ;
702
- assert (!TaintArgs->isEmpty ());
703
695
704
696
LLVM_DEBUG (for (ArgIdxTy I
705
- : * TaintArgs) {
697
+ : TaintArgs) {
706
698
llvm::dbgs () << " PostCall<" ;
707
699
Call.dump (llvm::dbgs ());
708
700
llvm::dbgs () << " > actually wants to taint arg index: " << I << ' \n ' ;
709
701
});
710
702
711
- for (ArgIdxTy ArgNum : * TaintArgs) {
703
+ for (ArgIdxTy ArgNum : TaintArgs) {
712
704
// Special handling for the tainted return value.
713
705
if (ArgNum == ReturnValueIndex) {
714
706
State = addTaint (State, Call.getReturnValue ());
@@ -722,7 +714,7 @@ void GenericTaintChecker::checkPostCall(const CallEvent &Call,
722
714
}
723
715
724
716
// Clear up the taint info from the state.
725
- State = State->remove <TaintArgsOnPostVisit>(CurrentFrame );
717
+ State = State->remove <TaintArgsOnPostVisit>();
726
718
C.addTransition (State);
727
719
}
728
720
@@ -784,33 +776,28 @@ void GenericTaintRule::process(const GenericTaintChecker &Checker,
784
776
};
785
777
786
778
// / Propagate taint where it is necessary.
787
- auto &F = State->getStateManager ().get_context <ArgIdxFactory>();
788
- ImmutableSet<ArgIdxTy> Result = F.getEmptySet ();
789
779
ForEachCallArg (
790
- [this , WouldEscape, &Call, &Result, &F](ArgIdxTy I, const Expr *E,
791
- SVal V) {
780
+ [this , &State, WouldEscape, &Call](ArgIdxTy I, const Expr *E, SVal V) {
792
781
if (PropDstArgs.contains (I)) {
793
782
LLVM_DEBUG (llvm::dbgs () << " PreCall<" ; Call.dump (llvm::dbgs ());
794
783
llvm::dbgs ()
795
784
<< " > prepares tainting arg index: " << I << ' \n ' ;);
796
- Result = F. add (Result, I);
785
+ State = State-> add <TaintArgsOnPostVisit>( I);
797
786
}
798
787
799
788
// TODO: We should traverse all reachable memory regions via the
800
789
// escaping parameter. Instead of doing that we simply mark only the
801
790
// referred memory region as tainted.
802
791
if (WouldEscape (V, E->getType ())) {
803
- LLVM_DEBUG (if (!Result. contains (I)) {
792
+ LLVM_DEBUG (if (!State-> contains <TaintArgsOnPostVisit> (I)) {
804
793
llvm::dbgs () << " PreCall<" ;
805
794
Call.dump (llvm::dbgs ());
806
795
llvm::dbgs () << " > prepares tainting arg index: " << I << ' \n ' ;
807
796
});
808
- Result = F. add (Result, I);
797
+ State = State-> add <TaintArgsOnPostVisit>( I);
809
798
}
810
799
});
811
800
812
- if (!Result.isEmpty ())
813
- State = State->set <TaintArgsOnPostVisit>(C.getStackFrame (), Result);
814
801
C.addTransition (State);
815
802
}
816
803
@@ -901,11 +888,7 @@ void GenericTaintChecker::taintUnsafeSocketProtocol(const CallEvent &Call,
901
888
if (SafeProtocol)
902
889
return ;
903
890
904
- ProgramStateRef State = C.getState ();
905
- auto &F = State->getStateManager ().get_context <ArgIdxFactory>();
906
- ImmutableSet<ArgIdxTy> Result = F.add (F.getEmptySet (), ReturnValueIndex);
907
- State = State->set <TaintArgsOnPostVisit>(C.getStackFrame (), Result);
908
- C.addTransition (State);
891
+ C.addTransition (C.getState ()->add <TaintArgsOnPostVisit>(ReturnValueIndex));
909
892
}
910
893
911
894
// / Checker registration
0 commit comments