From 5e910e1a0a7d1c0625273851b90d0eba4e8086e6 Mon Sep 17 00:00:00 2001 From: David Baker Effendi Date: Fri, 3 May 2024 14:33:14 +0200 Subject: [PATCH 1/2] [language] Fix `Annotation.asInstanceOf[CfgNode].method` Throwing NullException Added additional annotation specific cases to `CfgNodeMethods.method`. Resolves #4529 --- .../io/joern/javasrc2cpg/querying/AnnotationTests.scala | 6 ++++-- .../semanticcpg/language/nodemethods/CfgNodeMethods.scala | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/AnnotationTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/AnnotationTests.scala index f9dd481306a6..7ce62729acb7 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/AnnotationTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/AnnotationTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.codepropertygraph.generated.nodes.{Annotation, AnnotationLiteral, ArrayInitializer} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class AnnotationTests extends JavaSrcCode2CpgFixture { "normal value annotations" should { @@ -24,6 +24,7 @@ class AnnotationTests extends JavaSrcCode2CpgFixture { annotationNode.fullName shouldBe "some.NormalAnnotation" annotationNode.lineNumber shouldBe Some(5) annotationNode.columnNumber shouldBe Some(3) + annotationNode.asInstanceOf[CfgNode].method.fullName shouldBe "SomeClass.function:void()" } "test annotation node parameter assignment child" in { @@ -84,6 +85,7 @@ class AnnotationTests extends JavaSrcCode2CpgFixture { paramValue.code shouldBe "classAnnotation" paramValue.order shouldBe 2 paramValue.argumentIndex shouldBe 2 + paramValue.method.fullName shouldBe "SomeClass.function:void()" } } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala index a15949550b9c..ad3d3cd9e03a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala @@ -108,7 +108,12 @@ class CfgNodeMethods(val node: CfgNode) extends AnyVal with NodeExtension { case _: MethodParameterIn | _: MethodParameterOut | _: MethodReturn => walkUpAst(node) case _: CallRepr if !node.isInstanceOf[Call] => walkUpAst(node) - case _: Expression | _: JumpTarget => walkUpContains(node) + case _: Annotation | _: AnnotationLiteral | _: AnnotationParameter | _: AnnotationParameterAssign => + node.astParent match { + case method: Method => method + case x: Expression => x.method + } + case _: Expression | _: JumpTarget => walkUpContains(node) } /** Obtain hexadecimal string representation of lineNumber field. From 3e72a3ea82ccb34a73dc4f7dc46125d3064e74e2 Mon Sep 17 00:00:00 2001 From: David Baker Effendi Date: Fri, 3 May 2024 15:33:34 +0200 Subject: [PATCH 2/2] Converted this to an `inAst` walk given `AnnotationParameter` and `AnnotationParameterAssign` are `AstNode`s --- .../semanticcpg/language/nodemethods/CfgNodeMethods.scala | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala index ad3d3cd9e03a..08ee7d72a7e6 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala @@ -108,12 +108,8 @@ class CfgNodeMethods(val node: CfgNode) extends AnyVal with NodeExtension { case _: MethodParameterIn | _: MethodParameterOut | _: MethodReturn => walkUpAst(node) case _: CallRepr if !node.isInstanceOf[Call] => walkUpAst(node) - case _: Annotation | _: AnnotationLiteral | _: AnnotationParameter | _: AnnotationParameterAssign => - node.astParent match { - case method: Method => method - case x: Expression => x.method - } - case _: Expression | _: JumpTarget => walkUpContains(node) + case _: Annotation | _: AnnotationLiteral => node.inAst.collectAll[Method].head + case _: Expression | _: JumpTarget => walkUpContains(node) } /** Obtain hexadecimal string representation of lineNumber field.