From f8dbbe006e67731d91ac9b45acd3826540329a8a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 7 Feb 2023 10:56:12 +0100 Subject: [PATCH 1/3] C#/Java: Materialize sink/source/summary predicates to avoid join on input/output before filtering. --- csharp/ql/src/Telemetry/ExternalApi.qll | 3 +++ java/ql/src/Telemetry/ExternalApi.qll | 3 +++ 2 files changed, 6 insertions(+) diff --git a/csharp/ql/src/Telemetry/ExternalApi.qll b/csharp/ql/src/Telemetry/ExternalApi.qll index d1464c4ef56..2b8aa1cf47e 100644 --- a/csharp/ql/src/Telemetry/ExternalApi.qll +++ b/csharp/ql/src/Telemetry/ExternalApi.qll @@ -85,6 +85,7 @@ class ExternalApi extends DotNet::Callable { } /** Holds if this API has a supported summary. */ + pragma[nomagic] predicate hasSummary() { this instanceof SummarizedCallable or @@ -92,11 +93,13 @@ class ExternalApi extends DotNet::Callable { } /** Holds if this API is a known source. */ + pragma[nomagic] predicate isSource() { this.getAnOutput() instanceof RemoteFlowSource or sourceNode(this.getAnOutput(), _) } /** Holds if this API is a known sink. */ + pragma[nomagic] predicate isSink() { sinkNode(this.getAnInput(), _) } /** Holds if this API is supported by existing CodeQL libraries, that is, it is either a recognized source or sink or has a flow summary. */ diff --git a/java/ql/src/Telemetry/ExternalApi.qll b/java/ql/src/Telemetry/ExternalApi.qll index 38cb81f3d56..b44c770f44b 100644 --- a/java/ql/src/Telemetry/ExternalApi.qll +++ b/java/ql/src/Telemetry/ExternalApi.qll @@ -74,16 +74,19 @@ class ExternalApi extends Callable { } /** Holds if this API has a supported summary. */ + pragma[nomagic] predicate hasSummary() { this = any(SummarizedCallable sc).asCallable() or TaintTracking::localAdditionalTaintStep(this.getAnInput(), _) } + pragma[nomagic] predicate isSource() { this.getAnOutput() instanceof RemoteFlowSource or sourceNode(this.getAnOutput(), _) } /** Holds if this API is a known sink. */ + pragma[nomagic] predicate isSink() { sinkNode(this.getAnInput(), _) } /** Holds if this API is supported by existing CodeQL libraries, that is, it is either a recognized source or sink or has a flow summary. */ From 02364d072e8a9829fd736874834838cb1801bfbc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 8 Feb 2023 11:59:59 +0100 Subject: [PATCH 2/3] Java: Fix bad join in TestLibrary characteristic predicate. --- java/ql/src/Telemetry/ExternalApi.qll | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/java/ql/src/Telemetry/ExternalApi.qll b/java/ql/src/Telemetry/ExternalApi.qll index b44c770f44b..5e28e540683 100644 --- a/java/ql/src/Telemetry/ExternalApi.qll +++ b/java/ql/src/Telemetry/ExternalApi.qll @@ -8,23 +8,25 @@ private import semmle.code.java.dataflow.FlowSummary private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.TaintTracking +pragma[nomagic] +private predicate isTestPackage(Package p) { + p.getName() + .matches([ + "org.junit%", "junit.%", "org.mockito%", "org.assertj%", + "com.github.tomakehurst.wiremock%", "org.hamcrest%", "org.springframework.test.%", + "org.springframework.mock.%", "org.springframework.boot.test.%", "reactor.test%", + "org.xmlunit%", "org.testcontainers.%", "org.opentest4j%", "org.mockserver%", + "org.powermock%", "org.skyscreamer.jsonassert%", "org.rnorth.visibleassertions", + "org.openqa.selenium%", "com.gargoylesoftware.htmlunit%", "org.jboss.arquillian.testng%", + "org.testng%" + ]) +} + /** * A test library. */ private class TestLibrary extends RefType { - TestLibrary() { - this.getPackage() - .getName() - .matches([ - "org.junit%", "junit.%", "org.mockito%", "org.assertj%", - "com.github.tomakehurst.wiremock%", "org.hamcrest%", "org.springframework.test.%", - "org.springframework.mock.%", "org.springframework.boot.test.%", "reactor.test%", - "org.xmlunit%", "org.testcontainers.%", "org.opentest4j%", "org.mockserver%", - "org.powermock%", "org.skyscreamer.jsonassert%", "org.rnorth.visibleassertions", - "org.openqa.selenium%", "com.gargoylesoftware.htmlunit%", - "org.jboss.arquillian.testng%", "org.testng%" - ]) - } + TestLibrary() { isTestPackage(this.getPackage()) } } private string containerAsJar(Container container) { From f6a02310d3fcd3559fc4e6163187a0c5fcefe95c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 8 Feb 2023 16:37:49 +0100 Subject: [PATCH 3/3] C#: Fix bad join order in TestLibrary characteristic predicate. --- csharp/ql/src/Telemetry/ExternalApi.qll | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/csharp/ql/src/Telemetry/ExternalApi.qll b/csharp/ql/src/Telemetry/ExternalApi.qll index 2b8aa1cf47e..94168e6d3fe 100644 --- a/csharp/ql/src/Telemetry/ExternalApi.qll +++ b/csharp/ql/src/Telemetry/ExternalApi.qll @@ -11,17 +11,19 @@ private import semmle.code.csharp.dataflow.internal.DataFlowDispatch as DataFlow private import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate private import semmle.code.csharp.security.dataflow.flowsources.Remote +pragma[nomagic] +private predicate isTestNamespace(Namespace ns) { + ns.getFullName() + .matches([ + "NUnit.Framework%", "Xunit%", "Microsoft.VisualStudio.TestTools.UnitTesting%", "Moq%" + ]) +} + /** * A test library. */ class TestLibrary extends RefType { - TestLibrary() { - this.getNamespace() - .getFullName() - .matches([ - "NUnit.Framework%", "Xunit%", "Microsoft.VisualStudio.TestTools.UnitTesting%", "Moq%" - ]) - } + TestLibrary() { isTestNamespace(this.getNamespace()) } } /** Holds if the given callable is not worth supporting. */