From 7cc091912fab565650ed219238f7a42db8aa80bf Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 19 May 2025 19:03:59 +0100 Subject: [PATCH 1/2] C++/Shared: Convert the global control-flow library to a shared parameterized module. --- cpp/ql/lib/qlpack.yml | 1 + .../semmle/code/cpp/interproccontrolflow/ControlFlow.qll | 2 +- .../interproccontrolflow/internal/ControlFlowSpecific.qll | 2 +- .../codeql/globalcontrolflow}/ControlFlow.qll | 0 .../codeql/globalcontrolflow}/internal/ControlFlowImpl.qll | 2 +- shared/global-controlflow/qlpack.yml | 7 +++++++ 6 files changed, 11 insertions(+), 3 deletions(-) rename {cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared => shared/global-controlflow/codeql/globalcontrolflow}/ControlFlow.qll (100%) rename {cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared => shared/global-controlflow/codeql/globalcontrolflow}/internal/ControlFlowImpl.qll (99%) create mode 100644 shared/global-controlflow/qlpack.yml diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index ebc158065aa6..b2a830506601 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -15,6 +15,7 @@ dependencies: codeql/tutorial: ${workspace} codeql/util: ${workspace} codeql/xml: ${workspace} + codeql/global-controlflow: ${workspace} dataExtensions: - ext/*.model.yml - ext/generated/*.model.yml diff --git a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/ControlFlow.qll b/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/ControlFlow.qll index 09c5ec16c58b..cd7dfea33110 100644 --- a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/ControlFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/ControlFlow.qll @@ -5,7 +5,7 @@ import cpp */ module ControlFlow { private import internal.ControlFlowSpecific - private import shared.ControlFlow + private import codeql.globalcontrolflow.ControlFlow import ControlFlowMake import Public } diff --git a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/internal/ControlFlowSpecific.qll b/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/internal/ControlFlowSpecific.qll index 414d269eb6c0..8f946fd38aff 100644 --- a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/internal/ControlFlowSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/internal/ControlFlowSpecific.qll @@ -3,7 +3,7 @@ */ private import cpp -private import semmle.code.cpp.interproccontrolflow.shared.ControlFlow +private import codeql.globalcontrolflow.ControlFlow module Private { import ControlFlowPrivate diff --git a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared/ControlFlow.qll b/shared/global-controlflow/codeql/globalcontrolflow/ControlFlow.qll similarity index 100% rename from cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared/ControlFlow.qll rename to shared/global-controlflow/codeql/globalcontrolflow/ControlFlow.qll diff --git a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared/internal/ControlFlowImpl.qll b/shared/global-controlflow/codeql/globalcontrolflow/internal/ControlFlowImpl.qll similarity index 99% rename from cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared/internal/ControlFlowImpl.qll rename to shared/global-controlflow/codeql/globalcontrolflow/internal/ControlFlowImpl.qll index bb2f6acbb320..ee21eb892ae9 100644 --- a/cpp/ql/lib/semmle/code/cpp/interproccontrolflow/shared/internal/ControlFlowImpl.qll +++ b/shared/global-controlflow/codeql/globalcontrolflow/internal/ControlFlowImpl.qll @@ -1,6 +1,6 @@ private import codeql.util.Unit private import codeql.util.Location -private import semmle.code.cpp.interproccontrolflow.shared.ControlFlow +private import codeql.globalcontrolflow.ControlFlow module MakeImpl Lang> { private import Lang diff --git a/shared/global-controlflow/qlpack.yml b/shared/global-controlflow/qlpack.yml new file mode 100644 index 000000000000..47eebf9a489c --- /dev/null +++ b/shared/global-controlflow/qlpack.yml @@ -0,0 +1,7 @@ +name: codeql/global-controlflow +version: 0.0.1 +groups: shared +library: true +dependencies: + codeql/util: ${workspace} +warnOnImplicitThis: true From f00c3702046ce29f0723de35af37a4648983d39b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 19 May 2025 19:04:20 +0100 Subject: [PATCH 2/2] C#: Instantiate the (now shared) global control-flow library. --- csharp/ql/lib/qlpack.yml | 1 + .../interproccontrolflow/ControlFlow.qll | 11 +++++++ .../internal/ControlFlowPrivate.qll | 32 +++++++++++++++++++ .../internal/ControlFlowPublic.qll | 13 ++++++++ .../internal/ControlFlowSpecific.qll | 19 +++++++++++ 5 files changed, 76 insertions(+) create mode 100644 csharp/ql/lib/semmle/code/csharp/interproccontrolflow/ControlFlow.qll create mode 100644 csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPrivate.qll create mode 100644 csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPublic.qll create mode 100644 csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowSpecific.qll diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 3a8371dd4d4a..6612561523d5 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -15,6 +15,7 @@ dependencies: codeql/tutorial: ${workspace} codeql/util: ${workspace} codeql/xml: ${workspace} + codeql/global-controlflow: ${workspace} dataExtensions: - ext/*.model.yml - ext/generated/*.model.yml diff --git a/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/ControlFlow.qll b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/ControlFlow.qll new file mode 100644 index 000000000000..79de23b8bd23 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/ControlFlow.qll @@ -0,0 +1,11 @@ +import csharp + +/** + * Provides classes for performing global (inter-procedural) control flow analyses. + */ +module ControlFlow { + private import internal.ControlFlowSpecific + private import codeql.globalcontrolflow.ControlFlow + import ControlFlowMake + import Public +} diff --git a/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPrivate.qll new file mode 100644 index 000000000000..e9043da6c604 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPrivate.qll @@ -0,0 +1,32 @@ +private import csharp as CS +private import ControlFlowPublic + +predicate edge(Node n1, Node n2) { n1.getASuccessor() = n2 } + +predicate callTarget(CallNode call, Callable target) { call.getARuntimeTarget() = target } + +predicate flowEntry(Callable c, Node entry) { + entry.(CS::ControlFlow::Nodes::EntryNode).getCallable() = c +} + +predicate flowExit(Callable c, Node exitNode) { + exitNode.(CS::ControlFlow::Nodes::ExitNode).getCallable() = c +} + +Callable getEnclosingCallable(Node n) { n.getEnclosingCallable() = result } + +predicate hiddenNode(Node n) { none() } + +private newtype TSplit = TNone() { none() } + +class Split extends TSplit { + abstract string toString(); + + abstract CS::Location getLocation(); + + abstract predicate entry(Node n1, Node n2); + + abstract predicate exit(Node n1, Node n2); + + abstract predicate blocked(Node n1, Node n2); +} diff --git a/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPublic.qll new file mode 100644 index 000000000000..a67bc54a90b7 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowPublic.qll @@ -0,0 +1,13 @@ +private import csharp as CS + +class Node extends CS::ControlFlow::Node { } + +class CallNode extends Node { + CS::Call call; + + CallNode() { call = super.getAstNode() } + + Callable getARuntimeTarget() { result = call.getARuntimeTarget() } +} + +class Callable = CS::Callable; diff --git a/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowSpecific.qll b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowSpecific.qll new file mode 100644 index 000000000000..f1f8ba3a5d75 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/interproccontrolflow/internal/ControlFlowSpecific.qll @@ -0,0 +1,19 @@ +/** + * Provides C#-specific definitions for use in the control-flow library. + */ + +private import csharp +private import codeql.globalcontrolflow.ControlFlow + +module Private { + import ControlFlowPrivate +} + +module Public { + import ControlFlowPublic +} + +module CSharpControlFlow implements InputSig { + import Private + import Public +}