@@ -4,8 +4,7 @@ import io.shiftleft.codepropertygraph.Cpg
44import io .shiftleft .codepropertygraph .generated .{nodes , _ }
55import io .shiftleft .passes .{DiffGraph , ParallelCpgPass }
66import io .shiftleft .semanticcpg .language ._
7-
8- import scala .collection .mutable
7+ import overflowdb .traversal .Traversal
98
109/**
1110 * A pass that calculates reaching definitions ("data dependencies").
@@ -29,14 +28,12 @@ class ReachingDefPass(cpg: Cpg) extends ParallelCpgPass[nodes.Method](cpg) {
2928 private def addReachingDefEdges (method : nodes.Method , solution : Solution [Set [Definition ]]): DiffGraph .Builder = {
3029
3130 val dstGraph = DiffGraph .newBuilder
32- val nodesWithOutgoingEdges : mutable.Set [nodes.StoredNode ] = mutable.Set ()
3331
3432 def addEdge (fromNode : nodes.StoredNode , toNode : nodes.StoredNode , variable : String = " " ): Unit = {
3533 val properties = List ((EdgeKeyNames .VARIABLE , variable))
3634 if (fromNode.isInstanceOf [nodes.Unknown ] || toNode
3735 .isInstanceOf [nodes.Unknown ])
3836 return
39- nodesWithOutgoingEdges += fromNode
4037 dstGraph.addEdgeInOriginal(fromNode, toNode, EdgeTypes .REACHING_DEF , properties)
4138 }
4239
@@ -61,9 +58,9 @@ class ReachingDefPass(cpg: Cpg) extends ParallelCpgPass[nodes.Method](cpg) {
6158 // For all calls, assume that input arguments
6259 // taint corresponding output arguments
6360 // and the return value
64- usageAnalyzer.uses(call ).foreach { use =>
65- gen(call ).foreach { g =>
66- if (use != g.node) {
61+ usageAnalyzer.uses(node ).foreach { use =>
62+ gen(node ).foreach { g =>
63+ if (use != g.node && nodeMayBeSource(use) ) {
6764 addEdge(use, g.node, nodeToEdgeLabel(use))
6865 }
6966 }
@@ -82,39 +79,33 @@ class ReachingDefPass(cpg: Cpg) extends ParallelCpgPass[nodes.Method](cpg) {
8279 }
8380 addEdge(ret, method.methodReturn, " <RET>" )
8481
82+ case exitNode : nodes.MethodReturn =>
83+ in(exitNode).foreach { i =>
84+ addEdge(i.node, exitNode, nodeToEdgeLabel(i.node))
85+ }
8586 case _ =>
8687 }
8788 }
8889
8990 // Add edges from the entry node
9091 allNodes
91- .filterNot(
92- x =>
93- x.isInstanceOf [nodes.Method ] || x
94- .isInstanceOf [nodes.ControlStructure ] || x.isInstanceOf [nodes.FieldIdentifier ] || x
95- .isInstanceOf [nodes.JumpTarget ] || x.isInstanceOf [nodes.MethodReturn ] || x.isInstanceOf [nodes.Block ])
92+ .filter(nodeMayBeSource)
9693 .foreach { node =>
9794 if (usageAnalyzer.usedIncomingDefs(node).isEmpty) {
9895 addEdge(method, node)
9996 }
10097 }
101-
102- // Add edges to exit node
103- val exitNode = method.methodReturn
104- (allNodes.toSet -- nodesWithOutgoingEdges).toList
105- .filter(_ != exitNode)
106- .filter(_ != method)
107- .filterNot(
108- x =>
109- x.isInstanceOf [nodes.Method ] || x
110- .isInstanceOf [nodes.ControlStructure ] || x.isInstanceOf [nodes.FieldIdentifier ] || x
111- .isInstanceOf [nodes.JumpTarget ] || x.isInstanceOf [nodes.MethodReturn ])
112- .foreach { from =>
113- addEdge(from, exitNode)
114- }
11598 dstGraph
11699 }
117100
101+ private def nodeMayBeSource (x : nodes.StoredNode ): Boolean = {
102+ ! (
103+ x.isInstanceOf [nodes.Method ] || x
104+ .isInstanceOf [nodes.ControlStructure ] || x.isInstanceOf [nodes.FieldIdentifier ] || x
105+ .isInstanceOf [nodes.JumpTarget ] || x.isInstanceOf [nodes.MethodReturn ] || x.isInstanceOf [nodes.Block ]
106+ )
107+ }
108+
118109 private def nodeToEdgeLabel (node : nodes.StoredNode ): String = {
119110 node match {
120111 case n : nodes.CfgNode => n.code
0 commit comments