internal static void AssertHasTaintStatus(FlowOutputSet outSet, string variableName, string assertMessage, TaintStatus taintStatus, Analysis.FlagType flag) { var varID = new VariableIdentifier(variableName); var variable = outSet.GetVariable(varID); var values = variable.ReadMemory(outSet.Snapshot).PossibleValues.ToArray(); var computedTaintStatus = new TaintStatus(false, true); if (values.Count() == 0) { computedTaintStatus.priority.setAll(false); } foreach (var value in values) { if (!(value is InfoValue <TaintInfo>)) { continue; } TaintInfo valueTaintInfo = (value as InfoValue <TaintInfo>).Data; TaintStatus valueTaintStatus = new TaintStatus(valueTaintInfo, flag); computedTaintStatus.tainted.copyTaint(true, valueTaintStatus.tainted); computedTaintStatus.priority.copyTaint(false, valueTaintStatus.priority); computedTaintStatus.lines.AddRange(valueTaintStatus.lines); } String taintStatusString = taintStatus.ToString(flag); String computedTaintStatusString = computedTaintStatus.ToString(flag); Assert.IsTrue(taintStatus.EqualTo(computedTaintStatus, flag), "Taint status of the taint type {0} of variable ${1} should be {2}, taint analysis computed {3}", flag, variableName, taintStatusString, computedTaintStatusString); }
internal TestCase HasTaintStatus(TaintStatus taintStatus, Analysis.FlagType flag) { _asserts.Add((ppg) => { var output = GetEndOutput(ppg); AnalysisTestUtils.AssertHasTaintStatus(output, VariableName, AssertMessage, taintStatus, flag); }); return(this); }