From 4e83eb889d1b72e558a846592596c980a925512c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Leuth=C3=A4user?= <1417198+max-leuthaeuser@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:04:09 +0100 Subject: [PATCH] Fixed ref edges for destructed params (#248) For: https://github.com/joernio/joern/issues/2237 --- .../js2cpg/astcreation/AstCreator.scala | 26 +++++++------------ .../js2cpg/passes/AstCreationPassTest.scala | 11 ++++++++ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala b/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala index b48a9aeb..a5c7db12 100644 --- a/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala +++ b/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala @@ -227,9 +227,11 @@ class AstCreator(diffGraph: DiffGraphBuilder, source: JsSource, usedIdentNodes: astEdgeBuilder.addAstEdge(destructingAssignmentId, blockId, blockOrder) case None => paramComponents.foreach { param => - val paramName = param.getName - val localParamId = createIdentifierNode(paramName, param) - val paramId = createIdentifierNode(name, param) + val paramName = param.getName + val localParamId = createIdentifierNode(paramName, param) + val paramId = createIdentifierNode(name, param) + scope.addVariableReference(name, paramId) + val localParamLocal = astNodeBuilder.createLocalNode(paramName, Defines.ANY.label) addLocalToAst(localParamLocal) scope.addVariable(paramName, localParamLocal, MethodScope) @@ -257,13 +259,9 @@ class AstCreator(diffGraph: DiffGraphBuilder, source: JsSource, usedIdentNodes: astNodeBuilder.createParameterInNode(name, code, methodId, parameter, new OrderTracker(index)) initStatement match { case Some(initExpr: VarNode) => - val paramName = initExpr.getName.getName - + val paramName = initExpr.getName.getName val localParamId = createIdentifierNode(paramName, initExpr) - - val rhs = - createRhsForConditionalParameterInit(initExpr.getAssignmentSource, name, initExpr) - + val rhs = createRhsForConditionalParameterInit(initExpr.getAssignmentSource, name, initExpr) val assignmentCallId = astNodeBuilder.createAssignmentNode(localParamId, rhs, astNodeBuilder.lineAndColumn(initExpr)) astEdgeBuilder.addAstEdge(assignmentCallId, blockId, blockOrder) @@ -272,18 +270,14 @@ class AstCreator(diffGraph: DiffGraphBuilder, source: JsSource, usedIdentNodes: convertDestructingAssignment(initExpr.getExpression.asInstanceOf[BinaryNode], Some(name)) astEdgeBuilder.addAstEdge(destructingAssignmentId, blockId, blockOrder) case None => - val paramName = name - - val localParam = astNodeBuilder.createLocalNode(paramName, Defines.ANY.label) - addLocalToAst(localParam) - - val localParamId = createIdentifierNode(paramName, parameter) - + val paramName = name + val localParamId = createIdentifierNode(paramName, parameter) val localParamLocal = astNodeBuilder.createLocalNode(paramName, Defines.ANY.label) addLocalToAst(localParamLocal) scope.addVariable(paramName, localParamLocal, MethodScope) val paramId = createIdentifierNode(name, parameter) + scope.addVariableReference(name, paramId) val keyId = astNodeBuilder.createFieldIdentifierNode(paramName, parameter) diff --git a/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala b/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala index e5785c14..034c50b0 100644 --- a/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala +++ b/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala @@ -15,6 +15,7 @@ import io.shiftleft.codepropertygraph.generated.{ Operators, PropertyNames } +import io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn import io.shiftleft.js2cpg.core.{Config, Report} import io.shiftleft.js2cpg.io.FileDefaults.JS_SUFFIX import io.shiftleft.js2cpg.io.FileUtils @@ -3131,6 +3132,16 @@ class AstCreationPassTest extends AbstractPassTest { tmpReturnIdentifier.checkProperty(PropertyNames.NAME, "_tmp_0") } + "have correct ref edge (destructing parameter)" in AstFixture(""" + |const WindowOpen = ({ value }) => { + | return () => windowOpenButton(value); + |};""".stripMargin) { cpg => + val List(param) = cpg.identifier.name("param1_0").refsTo.collectAll[MethodParameterIn].l + param.name shouldBe "param1_0" + param.code shouldBe "{value}" + param.method.fullName shouldBe "test.js::program:anonymous" + } + "have correct structure for object deconstruction in function parameter" in AstFixture( "function foo({ a }, b) {}" ) { cpg =>