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/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 +} 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