Skip to content

Commit 456f02f

Browse files
committed
C#: Add BarrierGuard parameterised module.
1 parent 6518a01 commit 456f02f

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,33 @@ abstract class NonLocalJumpNode extends Node {
173173
}
174174

175175
/**
176+
* Holds if the guard `g` validates the expression `e` upon evaluating to `v`.
177+
*
178+
* The expression `e` is expected to be a syntactic part of the guard `g`.
179+
* For example, the guard `g` might be a call `isSafe(x)` and the expression `e`
180+
* the argument `x`.
181+
*/
182+
signature predicate guardChecksSig(Guard g, Expr e, AbstractValue v);
183+
184+
/**
185+
* Provides a set of barrier nodes for a guard that validates an expression.
186+
*
187+
* This is expected to be used in `isBarrier`/`isSanitizer` definitions
188+
* in data flow and taint tracking.
189+
*/
190+
module BarrierGuard<guardChecksSig/3 guardChecks> {
191+
/** Gets a node that is safely guarded by the given guard check. */
192+
ExprNode getABarrierNode() {
193+
exists(Guard g, Expr e, AbstractValue v |
194+
guardChecks(g, e, v) and
195+
g.controlsNode(result.getControlFlowNode(), e, v)
196+
)
197+
}
198+
}
199+
200+
/**
201+
* DEPRECATED: Use `BarrierGuard` module instead.
202+
*
176203
* A guard that validates some expression.
177204
*
178205
* To use this in a configuration, extend the class and provide a
@@ -181,7 +208,7 @@ abstract class NonLocalJumpNode extends Node {
181208
*
182209
* It is important that all extending classes in scope are disjoint.
183210
*/
184-
class BarrierGuard extends Guard {
211+
deprecated class BarrierGuard extends Guard {
185212
/** Holds if this guard validates `e` upon evaluating to `v`. */
186213
abstract predicate checks(Expr e, AbstractValue v);
187214

0 commit comments

Comments
 (0)