mirror of
https://github.com/github/codeql.git
synced 2026-04-28 10:15:14 +02:00
Merge pull request #12236 from MathiasVP/language-specific-field-flow-branch-limit-term
Dataflow: Add a language specific term to `join` and `branch`
This commit is contained in:
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -565,3 +565,12 @@ private class MyConsistencyConfiguration extends Consistency::ConsistencyConfigu
|
||||
any()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -318,3 +318,12 @@ private class MyConsistencyConfiguration extends Consistency::ConsistencyConfigu
|
||||
// consistency alerts enough that most of them are interesting.
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -414,3 +414,12 @@ private class MyConsistencyConfiguration extends Consistency::ConsistencyConfigu
|
||||
any()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2374,3 +2374,12 @@ module Csv {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -390,3 +390,12 @@ class ContentApprox = Unit;
|
||||
/** Gets an approximated value for content `c`. */
|
||||
pragma[inline]
|
||||
ContentApprox getContentApprox(Content c) { any() }
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -478,3 +478,12 @@ predicate containerContent(Content c) {
|
||||
c instanceof MapKeyContent or
|
||||
c instanceof MapValueContent
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1008,3 +1008,12 @@ class ContentApprox = Unit;
|
||||
/** Gets an approximated value for content `c`. */
|
||||
pragma[inline]
|
||||
ContentApprox getContentApprox(Content c) { any() }
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1498,3 +1498,12 @@ class AdditionalJumpStep extends Unit {
|
||||
*/
|
||||
abstract predicate step(Node pred, Node succ);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
@@ -959,6 +959,17 @@ module Impl<FullStateConfigSig Config> {
|
||||
not inBarrier(p)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to `branch` and `join` when deciding whether
|
||||
* the amount of forward or backward branching is within the limit specified by the
|
||||
* configuration.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private int getLanguageSpecificFlowIntoCallNodeCand1(ArgNodeEx arg, ParamNodeEx p) {
|
||||
flowIntoCallNodeCand1(_, arg, p) and
|
||||
result = getAdditionalFlowIntoCallNodeTerm(arg.projectToNode(), p.projectToNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of forward branching on the origin of a cross-call path
|
||||
* edge in the graph of paths between sources and sinks that ignores call
|
||||
@@ -968,6 +979,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int branch(NodeEx n1) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n1, _, n) or flowIntoCallNodeCand1(_, n1, n))
|
||||
+ sum(ParamNodeEx p1 | | getLanguageSpecificFlowIntoCallNodeCand1(n1, p1))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -979,6 +991,7 @@ module Impl<FullStateConfigSig Config> {
|
||||
private int join(NodeEx n2) {
|
||||
result =
|
||||
strictcount(NodeEx n | flowOutOfCallNodeCand1(_, n, _, n2) or flowIntoCallNodeCand1(_, n, n2))
|
||||
+ sum(ArgNodeEx arg2 | | getLanguageSpecificFlowIntoCallNodeCand1(arg2, n2))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -699,3 +699,12 @@ class ContentApprox = Unit;
|
||||
/** Gets an approximated value for content `c`. */
|
||||
pragma[inline]
|
||||
ContentApprox getContentApprox(Content c) { any() }
|
||||
|
||||
/**
|
||||
* Gets an additional term that is added to the `join` and `branch` computations to reflect
|
||||
* an additional forward or backwards branching factor that is not taken into account
|
||||
* when calculating the (virtual) dispatch cost.
|
||||
*
|
||||
* Argument `arg` is part of a path from a source to a sink, and `p` is the target parameter.
|
||||
*/
|
||||
int getAdditionalFlowIntoCallNodeTerm(ArgumentNode arg, ParameterNode p) { none() }
|
||||
|
||||
Reference in New Issue
Block a user