From ce4e73013c4019e5cd362a7e7396b5ccc46f4284 Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Mon, 23 Sep 2024 11:17:28 +0200 Subject: [PATCH 1/8] Add handleDelete method --- .../cpg/graph/statements/expressions/DeleteExpression.kt | 8 ++++++-- .../aisec/cpg/frontends/python/StatementHandler.kt | 9 ++++++++- .../python/statementHandler/StatementHandlerTest.kt | 7 +++++++ cpg-language-python/src/test/resources/python/delete.py | 3 +++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 cpg-language-python/src/test/resources/python/delete.py diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt index 7540cf5772..7bed41f775 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt @@ -25,6 +25,7 @@ */ package de.fraunhofer.aisec.cpg.graph.statements.expressions +import de.fraunhofer.aisec.cpg.graph.edges.ast.astEdgesOf import de.fraunhofer.aisec.cpg.graph.edges.ast.astOptionalEdgeOf import de.fraunhofer.aisec.cpg.graph.edges.unwrapping import java.util.Objects @@ -34,11 +35,14 @@ class DeleteExpression : Expression() { @Relationship("OPERAND") var operandEdge = astOptionalEdgeOf() var operand by unwrapping(DeleteExpression::operandEdge) + @Relationship(value = "TARGETS") var targetEdges = astEdgesOf() + var targets by unwrapping(DeleteExpression::targetEdges) + override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is DeleteExpression) return false - return super.equals(other) && operand == other.operand + return super.equals(other) && operand == other.operand && targets == other.targets } - override fun hashCode() = Objects.hash(super.hashCode(), operand) + override fun hashCode() = Objects.hash(super.hashCode(), operand, targets) } diff --git a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt index 10e6bf846d..06e3e3e33a 100644 --- a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt +++ b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt @@ -67,7 +67,7 @@ class StatementHandler(frontend: PythonLanguageFrontend) : is Python.AST.Break -> newBreakStatement(rawNode = node) is Python.AST.Continue -> newContinueStatement(rawNode = node) is Python.AST.Assert -> handleAssert(node) - is Python.AST.Delete, + is Python.AST.Delete -> handleDelete(node) is Python.AST.Global, is Python.AST.Match, is Python.AST.Nonlocal, @@ -83,6 +83,13 @@ class StatementHandler(frontend: PythonLanguageFrontend) : } } + private fun handleDelete(node: Python.AST.Delete): Statement { + val deleteStmt = newDeleteExpression(node) + deleteStmt.targets = + node.targets.map { frontend.expressionHandler.handle(it) }.toMutableList() + return deleteStmt + } + /** * Translates a Python (https://docs.python.org/3/library/ast.html#ast.Assert] into a * [AssertStatement]. diff --git a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt index 68a45b3eef..cffda71763 100644 --- a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt +++ b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt @@ -123,4 +123,11 @@ class StatementHandlerTest { assertNotNull(message, "Assert statement should have a message") assertEquals("Test message", message.value, "The assert message is incorrect") } + + @Test + fun testDelete() { + analyzeFile("delete.py") + + val test = result + } } diff --git a/cpg-language-python/src/test/resources/python/delete.py b/cpg-language-python/src/test/resources/python/delete.py new file mode 100644 index 0000000000..f24b39f841 --- /dev/null +++ b/cpg-language-python/src/test/resources/python/delete.py @@ -0,0 +1,3 @@ +x = 5 +y = x +del x \ No newline at end of file From cc36194b4a34ac7312dd1135a90846d2d5811fa7 Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Tue, 24 Sep 2024 15:21:29 +0200 Subject: [PATCH 2/8] Add tests for delete handling --- .../cpg/frontends/python/StatementHandler.kt | 24 +++++++++++---- .../statementHandler/StatementHandlerTest.kt | 30 +++++++++++++++++-- .../src/test/resources/python/delete.py | 19 ++++++++++-- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt index 06e3e3e33a..8b50700057 100644 --- a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt +++ b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt @@ -37,6 +37,7 @@ import de.fraunhofer.aisec.cpg.graph.statements.AssertStatement import de.fraunhofer.aisec.cpg.graph.statements.DeclarationStatement import de.fraunhofer.aisec.cpg.graph.statements.Statement import de.fraunhofer.aisec.cpg.graph.statements.expressions.Block +import de.fraunhofer.aisec.cpg.graph.statements.expressions.DeleteExpression import de.fraunhofer.aisec.cpg.graph.statements.expressions.Expression import de.fraunhofer.aisec.cpg.graph.statements.expressions.MemberExpression import de.fraunhofer.aisec.cpg.graph.statements.expressions.ProblemExpression @@ -83,11 +84,24 @@ class StatementHandler(frontend: PythonLanguageFrontend) : } } - private fun handleDelete(node: Python.AST.Delete): Statement { - val deleteStmt = newDeleteExpression(node) - deleteStmt.targets = - node.targets.map { frontend.expressionHandler.handle(it) }.toMutableList() - return deleteStmt + /** + * Translates a Python [`Delete`](https://docs.python.org/3/library/ast.html#ast.Delete] into a + * [DeleteExpression]. + */ + private fun handleDelete(node: Python.AST.Delete): DeleteExpression { + val delete = newDeleteExpression(node) + node.targets.forEach { target -> + if (target is Python.AST.Subscript) { + delete.targets.add(frontend.expressionHandler.handle(target)) + } else { + delete.additionalProblems += + newProblemExpression( + problem = "Delete is only supported for Subscript targets.", + rawNode = target + ) + } + } + return delete } /** diff --git a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt index cffda71763..f2dade2273 100644 --- a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt +++ b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt @@ -29,7 +29,9 @@ import de.fraunhofer.aisec.cpg.TranslationResult import de.fraunhofer.aisec.cpg.frontends.python.PythonLanguage import de.fraunhofer.aisec.cpg.graph.* import de.fraunhofer.aisec.cpg.graph.statements.AssertStatement +import de.fraunhofer.aisec.cpg.graph.statements.expressions.DeleteExpression import de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal +import de.fraunhofer.aisec.cpg.graph.statements.expressions.SubscriptExpression import de.fraunhofer.aisec.cpg.test.analyze import de.fraunhofer.aisec.cpg.test.analyzeAndGetFirstTU import de.fraunhofer.aisec.cpg.test.assertResolvedType @@ -37,6 +39,7 @@ import java.nio.file.Path import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull +import kotlin.test.assertTrue import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.TestInstance @@ -125,9 +128,32 @@ class StatementHandlerTest { } @Test - fun testDelete() { + fun testDeleteStatements() { analyzeFile("delete.py") - val test = result + val deleteExpressions = result.statements.filterIsInstance() + assertEquals(4, deleteExpressions.size) + + // Test for `del a` + val deleteStmt1 = deleteExpressions[0] + assertEquals(0, deleteStmt1.targets.size) + assertEquals(1, deleteStmt1.additionalProblems.size) + + // Test for `del my_list[2]` + val deleteStmt2 = deleteExpressions[1] + assertEquals(1, deleteStmt2.targets.size) + assertTrue(deleteStmt2.targets.first() is SubscriptExpression) + assertTrue(deleteStmt2.additionalProblems.isEmpty()) + + // Test for `del my_dict['b']` + val deleteStmt3 = deleteExpressions[2] + assertEquals(1, deleteStmt3.targets.size) + assertTrue(deleteStmt3.targets.first() is SubscriptExpression) + assertTrue(deleteStmt3.additionalProblems.isEmpty()) + + // Test for `del obj.d` + val deleteStmt4 = deleteExpressions[3] + assertEquals(0, deleteStmt4.targets.size) + assertEquals(1, deleteStmt4.additionalProblems.size) } } diff --git a/cpg-language-python/src/test/resources/python/delete.py b/cpg-language-python/src/test/resources/python/delete.py index f24b39f841..6181c76681 100644 --- a/cpg-language-python/src/test/resources/python/delete.py +++ b/cpg-language-python/src/test/resources/python/delete.py @@ -1,3 +1,16 @@ -x = 5 -y = x -del x \ No newline at end of file +a = 5 +b = a +del a + +my_list = [1, 2, 3] +del my_list[2] + +my_dict = {'a': 1, 'b': 2} +del my_dict['b'] + +class MyClass: + def __init__(self): + self.d = 1 + +obj = MyClass() +del obj.d \ No newline at end of file From e249638a4c84eafaa01139b7cee39140ea060b9d Mon Sep 17 00:00:00 2001 From: Maximilian Kaul Date: Tue, 24 Sep 2024 15:56:11 +0200 Subject: [PATCH 3/8] style --- .../fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt index 8b50700057..a366ab8d62 100644 --- a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt +++ b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt @@ -85,11 +85,11 @@ class StatementHandler(frontend: PythonLanguageFrontend) : } /** - * Translates a Python [`Delete`](https://docs.python.org/3/library/ast.html#ast.Delete] into a + * Translates a Python [`Delete`](https://docs.python.org/3/library/ast.html#ast.Delete) into a * [DeleteExpression]. */ private fun handleDelete(node: Python.AST.Delete): DeleteExpression { - val delete = newDeleteExpression(node) + val delete = newDeleteExpression(rawNode = node) node.targets.forEach { target -> if (target is Python.AST.Subscript) { delete.targets.add(frontend.expressionHandler.handle(target)) From f2bc0cdf5524a7485d325c5d1e5c1b1d6b95e58b Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Wed, 25 Sep 2024 09:33:39 +0200 Subject: [PATCH 4/8] Remove targets prop --- .../graph/statements/expressions/DeleteExpression.kt | 12 ++++-------- .../aisec/cpg/passes/EvaluationOrderGraphPass.kt | 4 +++- .../aisec/cpg/frontends/python/StatementHandler.kt | 5 +++-- .../python/statementHandler/StatementHandlerTest.kt | 12 ++++++------ 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt index 7bed41f775..dfa39b08f2 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/statements/expressions/DeleteExpression.kt @@ -26,23 +26,19 @@ package de.fraunhofer.aisec.cpg.graph.statements.expressions import de.fraunhofer.aisec.cpg.graph.edges.ast.astEdgesOf -import de.fraunhofer.aisec.cpg.graph.edges.ast.astOptionalEdgeOf import de.fraunhofer.aisec.cpg.graph.edges.unwrapping import java.util.Objects import org.neo4j.ogm.annotation.Relationship class DeleteExpression : Expression() { - @Relationship("OPERAND") var operandEdge = astOptionalEdgeOf() - var operand by unwrapping(DeleteExpression::operandEdge) - - @Relationship(value = "TARGETS") var targetEdges = astEdgesOf() - var targets by unwrapping(DeleteExpression::targetEdges) + @Relationship("OPERANDS") var operandEdges = astEdgesOf() + var operands by unwrapping(DeleteExpression::operandEdges) override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is DeleteExpression) return false - return super.equals(other) && operand == other.operand && targets == other.targets + return super.equals(other) && operands == other.operands } - override fun hashCode() = Objects.hash(super.hashCode(), operand, targets) + override fun hashCode() = Objects.hash(super.hashCode(), operands) } diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt index c19706f644..ab671ba2df 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/passes/EvaluationOrderGraphPass.kt @@ -670,7 +670,9 @@ open class EvaluationOrderGraphPass(ctx: TranslationContext) : TranslationUnitPa } protected fun handleDeleteExpression(node: DeleteExpression) { - createEOG(node.operand) + for (operand in node.operands) { + createEOG(operand) + } pushToEOG(node) } diff --git a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt index a366ab8d62..6e25690bf4 100644 --- a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt +++ b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt @@ -92,11 +92,12 @@ class StatementHandler(frontend: PythonLanguageFrontend) : val delete = newDeleteExpression(rawNode = node) node.targets.forEach { target -> if (target is Python.AST.Subscript) { - delete.targets.add(frontend.expressionHandler.handle(target)) + delete.operands.add(frontend.expressionHandler.handle(target)) } else { delete.additionalProblems += newProblemExpression( - problem = "Delete is only supported for Subscript targets.", + problem = + "'Name' and 'Attribute' deletions are not supported, as they removes them from the scope.", rawNode = target ) } diff --git a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt index f2dade2273..4b978f60e6 100644 --- a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt +++ b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt @@ -136,24 +136,24 @@ class StatementHandlerTest { // Test for `del a` val deleteStmt1 = deleteExpressions[0] - assertEquals(0, deleteStmt1.targets.size) + assertEquals(0, deleteStmt1.operands.size) assertEquals(1, deleteStmt1.additionalProblems.size) // Test for `del my_list[2]` val deleteStmt2 = deleteExpressions[1] - assertEquals(1, deleteStmt2.targets.size) - assertTrue(deleteStmt2.targets.first() is SubscriptExpression) + assertEquals(1, deleteStmt2.operands.size) + assertTrue(deleteStmt2.operands.first() is SubscriptExpression) assertTrue(deleteStmt2.additionalProblems.isEmpty()) // Test for `del my_dict['b']` val deleteStmt3 = deleteExpressions[2] - assertEquals(1, deleteStmt3.targets.size) - assertTrue(deleteStmt3.targets.first() is SubscriptExpression) + assertEquals(1, deleteStmt3.operands.size) + assertTrue(deleteStmt3.operands.first() is SubscriptExpression) assertTrue(deleteStmt3.additionalProblems.isEmpty()) // Test for `del obj.d` val deleteStmt4 = deleteExpressions[3] - assertEquals(0, deleteStmt4.targets.size) + assertEquals(0, deleteStmt4.operands.size) assertEquals(1, deleteStmt4.additionalProblems.size) } } From 7964696815328291c88142cae726126131316883 Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Wed, 25 Sep 2024 10:45:23 +0200 Subject: [PATCH 5/8] Fix handleDeleteExpression in CPP --- .../de/fraunhofer/aisec/cpg/frontends/cxx/ExpressionHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpg-language-cxx/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/ExpressionHandler.kt b/cpg-language-cxx/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/ExpressionHandler.kt index 48ba736625..1647567d08 100644 --- a/cpg-language-cxx/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/ExpressionHandler.kt +++ b/cpg-language-cxx/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/ExpressionHandler.kt @@ -321,7 +321,7 @@ class ExpressionHandler(lang: CXXLanguageFrontend) : for (name in ctx.implicitDestructorNames) { log.debug("Implicit constructor name {}", name) } - deleteExpression.operand = handle(ctx.operand) + handle(ctx.operand)?.let { deleteExpression.operands.add(it) } return deleteExpression } From 82a41c7da34f5da8c92b56d0d3a84bf949536675 Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Wed, 25 Sep 2024 14:15:46 +0200 Subject: [PATCH 6/8] Optimize imports --- .../frontends/python/statementHandler/StatementHandlerTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt index 35a5cc000e..df9b2a1ab3 100644 --- a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt +++ b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt @@ -36,13 +36,13 @@ import de.fraunhofer.aisec.cpg.test.* import de.fraunhofer.aisec.cpg.test.analyze import de.fraunhofer.aisec.cpg.test.analyzeAndGetFirstTU import de.fraunhofer.aisec.cpg.test.assertResolvedType -import org.junit.jupiter.api.BeforeAll -import org.junit.jupiter.api.TestInstance import java.nio.file.Path import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertTrue +import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class StatementHandlerTest : BaseTest() { From 4dd725cf8dec211c64b326fa41dca556052709da Mon Sep 17 00:00:00 2001 From: Leutrim Shala Date: Wed, 25 Sep 2024 14:28:23 +0200 Subject: [PATCH 7/8] Refactor test --- .../statementHandler/StatementHandlerTest.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt index df9b2a1ab3..1023f22fc7 100644 --- a/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt +++ b/cpg-language-python/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/python/statementHandler/StatementHandlerTest.kt @@ -161,15 +161,16 @@ class StatementHandlerTest : BaseTest() { @Test fun testTypeHints() { analyzeFile("type_hints.py") - - // type comments - val a = result.refs["a"] - assertNotNull(a) - assertEquals(with(result) { assertResolvedType("int") }, a.type) - - // type annotation - val b = result.refs["b"] - assertNotNull(b) - assertEquals(with(result) { assertResolvedType("str") }, b.type) + with(result) { + // type comments + val a = result.refs["a"] + assertNotNull(a) + assertEquals(assertResolvedType("int"), a.type) + + // type annotation + val b = result.refs["b"] + assertNotNull(b) + assertEquals(assertResolvedType("str"), b.type) + } } } From 487ee06d99c9109bfce922c15d251c4db4fb55e3 Mon Sep 17 00:00:00 2001 From: Christian Banse Date: Wed, 25 Sep 2024 17:43:50 +0200 Subject: [PATCH 8/8] Update cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt Co-authored-by: Maximilian Kaul --- .../fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt index 41aae0780c..d08f253aaf 100644 --- a/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt +++ b/cpg-language-python/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/python/StatementHandler.kt @@ -98,7 +98,7 @@ class StatementHandler(frontend: PythonLanguageFrontend) : delete.additionalProblems += newProblemExpression( problem = - "'Name' and 'Attribute' deletions are not supported, as they removes them from the scope.", + "handleDelete: 'Name' and 'Attribute' deletions are not supported, as they removes them from the scope.", rawNode = target ) }