Skip to content

C++/C#/Shared: Convert the global control-flow library to a shared parameterize module and make it available in C# #234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 19, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cpp/ql/lib/qlpack.yml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ import cpp
*/
module ControlFlow {
private import internal.ControlFlowSpecific
private import shared.ControlFlow
private import codeql.globalcontrolflow.ControlFlow
import ControlFlowMake<Location, CppControlFlow>
import Public
}
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
*/

private import cpp
private import semmle.code.cpp.interproccontrolflow.shared.ControlFlow
private import codeql.globalcontrolflow.ControlFlow

module Private {
import ControlFlowPrivate
1 change: 1 addition & 0 deletions csharp/ql/lib/qlpack.yml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<Location, CSharpControlFlow>
import Public
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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<Location> {
import Private
import Public
}
Original file line number Diff line number Diff line change
@@ -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<LocationSig Location, InputSig<Location> Lang> {
private import Lang
7 changes: 7 additions & 0 deletions shared/global-controlflow/qlpack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: codeql/global-controlflow
version: 0.0.1
groups: shared
library: true
dependencies:
codeql/util: ${workspace}
warnOnImplicitThis: true