in sapp/trimmed_trace_graph.py [0:0]
def populate_from_trace_graph(self, graph: TraceGraph) -> None:
"""Populates this graph from the given one based on affected_files"""
# Track which trace frames have been visited as we populate the full
# traces of the graph.
self._visited_trace_frame_ids: Set[int] = set()
self._populate_affected_issues(graph)
if not self._affected_issues_only:
# Finds issues from the conditions and saves them.
# Also saves traces that have been trimmed to the affected
# conditions.
self._populate_issues_from_affected_trace_frames(graph)
# Traces populated above may be missing all traces because
# _populate_issues_from_affected_trace_frames only populates
# traces that reach the affected conditions in one direction. We
# may need to populate traces in other directions too.
#
# For example:
#
# Issue_x reaches affected_file_x via postcondition_x (forward
# trace, i.e. trace leading to source). None of its backward
# traces (leading to sinks) reach the affected files.
#
# _populate_issues_from_affected_trace_frames would have copied its
# forward traces and trimmed it to those reaching postcondition_x.
# We cannot blindly populate all forward traces in this case as
# branches not leading to postcondition_x are unnecessary.
#
# However, in this specific example, all backward traces are needed
# to give a complete picture of which sinks the issue reaches.
# The following ensures that.
for instance_id in self._issue_instances.keys():
first_hop_ids = self._issue_instance_trace_frame_assoc[instance_id]
fwd_trace_ids = {
tf_id
for tf_id in first_hop_ids
if self._trace_frames[tf_id].kind == TraceKind.POSTCONDITION
}
bwd_trace_ids = {
tf_id
for tf_id in first_hop_ids
if self._trace_frames[tf_id].kind == TraceKind.PRECONDITION
}
if len(fwd_trace_ids) == 0:
self._populate_issue_trace(
graph, instance_id, TraceKind.POSTCONDITION
)
if len(bwd_trace_ids) == 0:
self._populate_issue_trace(
graph, instance_id, TraceKind.PRECONDITION
)
self._recompute_instance_properties(graph)