Skip to content

Commit 197cdab

Browse files
authored
Merge pull request github#16752 from michaelnebel/shared/sourcesinkcallables
C#/Java: Add some (shared) helper classes for Neutrals, Sources and Sink
2 parents 0e8af39 + 5792537 commit 197cdab

File tree

4 files changed

+108
-17
lines changed

4 files changed

+108
-17
lines changed

csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -431,20 +431,6 @@ Declaration interpretElement(
431431
)
432432
}
433433

434-
/**
435-
* A callable where there exists a MaD sink model that applies to it.
436-
*/
437-
class SinkCallable extends Callable {
438-
SinkCallable() { SourceSinkInterpretationInput::sinkElement(this, _, _, _, _) }
439-
}
440-
441-
/**
442-
* A callable where there exists a MaD source model that applies to it.
443-
*/
444-
class SourceCallable extends Callable {
445-
SourceCallable() { SourceSinkInterpretationInput::sourceElement(this, _, _, _, _) }
446-
}
447-
448434
cached
449435
private module Cached {
450436
/**
@@ -651,3 +637,33 @@ private class NeutralCallableAdapter extends NeutralCallable {
651637

652638
override predicate hasProvenance(Provenance provenance) { provenance = provenance_ }
653639
}
640+
641+
/**
642+
* A callable where there exists a MaD sink model that applies to it.
643+
*/
644+
private class SinkModelCallableAdapter extends SinkModelCallable {
645+
private Provenance provenance;
646+
647+
SinkModelCallableAdapter() {
648+
SourceSinkInterpretationInput::sinkElement(this, _, _, provenance, _)
649+
}
650+
651+
override predicate hasProvenance(Provenance p) { provenance = p }
652+
}
653+
654+
final class SinkCallable = SinkModelCallable;
655+
656+
/**
657+
* A callable where there exists a MaD source model that applies to it.
658+
*/
659+
private class SourceModelCallableAdapter extends SourceModelCallable {
660+
private Provenance provenance;
661+
662+
SourceModelCallableAdapter() {
663+
SourceSinkInterpretationInput::sourceElement(this, _, _, provenance, _)
664+
}
665+
666+
override predicate hasProvenance(Provenance p) { provenance = p }
667+
}
668+
669+
final class SourceCallable = SourceModelCallable;

java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,3 +641,33 @@ private class NeutralCallableAdapter extends NeutralCallable {
641641

642642
override predicate hasExactModel() { exact = true }
643643
}
644+
645+
/**
646+
* A callable where there exists a MaD sink model that applies to it.
647+
*/
648+
private class SinkModelCallableAdapter extends SinkModelCallable {
649+
private Provenance provenance;
650+
651+
SinkModelCallableAdapter() {
652+
SourceSinkInterpretationInput::sinkElement(this, _, _, provenance, _)
653+
}
654+
655+
override predicate hasProvenance(Provenance p) { provenance = p }
656+
}
657+
658+
final class SinkCallable = SinkModelCallable;
659+
660+
/**
661+
* A callable where there exists a MaD source model that applies to it.
662+
*/
663+
private class SourceModelCallableAdapter extends SourceModelCallable {
664+
private Provenance provenance;
665+
666+
SourceModelCallableAdapter() {
667+
SourceSinkInterpretationInput::sourceElement(this, _, _, provenance, _)
668+
}
669+
670+
override predicate hasProvenance(Provenance p) { provenance = p }
671+
}
672+
673+
final class SourceCallable = SourceModelCallable;
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
private import java
2+
private import semmle.code.java.dataflow.ExternalFlow
23
private import semmle.code.java.dataflow.internal.DataFlowPrivate
3-
private import semmle.code.java.dataflow.internal.FlowSummaryImpl
44
private import semmle.code.java.dataflow.internal.ModelExclusions
55
private import ModelEditor
66

77
/**
88
* A class of effectively public callables from source code.
99
*/
1010
class PublicEndpointFromSource extends Endpoint, ModelApi {
11-
override predicate isSource() { SourceSinkInterpretationInput::sourceElement(this, _, _, _, _) }
11+
override predicate isSource() { this instanceof SourceCallable }
1212

13-
override predicate isSink() { SourceSinkInterpretationInput::sinkElement(this, _, _, _, _) }
13+
override predicate isSink() { this instanceof SinkCallable }
1414
}

shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,20 @@ module Make<
270270
NeutralSummaryCallable() { this.getKind() = "summary" }
271271
}
272272

273+
/**
274+
* A callable that has a neutral source model.
275+
*/
276+
class NeutralSourceCallable extends NeutralCallableFinal {
277+
NeutralSourceCallable() { this.getKind() = "source" }
278+
}
279+
280+
/**
281+
* A callable that has a neutral sink model.
282+
*/
283+
class NeutralSinkCallable extends NeutralCallableFinal {
284+
NeutralSinkCallable() { this.getKind() = "sink" }
285+
}
286+
273287
/**
274288
* A callable that has a neutral model.
275289
*/
@@ -1739,6 +1753,37 @@ module Make<
17391753
)
17401754
}
17411755

1756+
final private class SourceOrSinkElementFinal = SourceOrSinkElement;
1757+
1758+
bindingset[this]
1759+
abstract private class SourceSinkModelCallableBase extends SourceOrSinkElementFinal {
1760+
/**
1761+
* Holds if there exists a manual model that applies to this.
1762+
*/
1763+
final predicate hasManualModel() { any(Provenance p | this.hasProvenance(p)).isManual() }
1764+
1765+
/**
1766+
* Holds if this has provenance `p`.
1767+
*/
1768+
abstract predicate hasProvenance(Provenance p);
1769+
}
1770+
1771+
/**
1772+
* A callable that has a source model.
1773+
*/
1774+
abstract class SourceModelCallable extends SourceSinkModelCallableBase {
1775+
bindingset[this]
1776+
SourceModelCallable() { exists(this) }
1777+
}
1778+
1779+
/**
1780+
* A callable that has a sink model.
1781+
*/
1782+
abstract class SinkModelCallable extends SourceSinkModelCallableBase {
1783+
bindingset[this]
1784+
SinkModelCallable() { exists(this) }
1785+
}
1786+
17421787
/** A source or sink relevant for testing. */
17431788
signature class RelevantSourceOrSinkElementSig extends SourceOrSinkElement {
17441789
/** Gets the string representation of this callable used by `source/1` or `sink/1`. */

0 commit comments

Comments
 (0)