Skip to content

Commit e9c9519

Browse files
committed
C#: Address review comments.
1 parent 55cfbcc commit e9c9519

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ private module Cached {
11491149
} or
11501150
TCapturedVariableContent(VariableCapture::CapturedVariable v) or
11511151
TDelegateCallArgumentContent(int i) {
1152-
i = [0 .. max(int j | j = any(DelegateCall dc).getNumberOfArguments())]
1152+
i = [0 .. max(any(DelegateCall dc).getNumberOfArguments())]
11531153
} or
11541154
TDelegateCallReturnContent()
11551155

@@ -2287,10 +2287,10 @@ private predicate recordProperty(RecordType t, ContentSet c, string name) {
22872287
* If there is a delegate call f(x), then we store "x" on "f"
22882288
* using a delegate argument content set.
22892289
*/
2290-
private predicate storeStepDelegateCall(Node node1, ContentSet c, Node node2) {
2291-
exists(DelegateCall call, int i |
2292-
node1.asExpr() = call.getArgument(i) and
2293-
node2.(PostUpdateNode).getPreUpdateNode().asExpr() = call.getExpr() and
2290+
private predicate storeStepDelegateCall(ExplicitArgumentNode node1, ContentSet c, Node node2) {
2291+
exists(ExplicitDelegateLikeDataFlowCall call, int i |
2292+
node1.argumentOf(call, TPositionalArgumentPosition(i)) and
2293+
lambdaCall(call, _, node2.(PostUpdateNode).getPreUpdateNode()) and
22942294
c.isDelegateCallArgument(i)
22952295
)
22962296
}
@@ -2456,10 +2456,10 @@ private predicate readContentStep(Node node1, Content c, Node node2) {
24562456
* If there is a delegate call f(x), then we read the return of the delegate
24572457
* call.
24582458
*/
2459-
private predicate readStepDelegateCall(Node node1, ContentSet c, Node node2) {
2460-
exists(DelegateCall call |
2461-
node1.asExpr() = call.getExpr() and
2462-
node2.asExpr() = call and
2459+
private predicate readStepDelegateCall(Node node1, ContentSet c, OutNode node2) {
2460+
exists(ExplicitDelegateLikeDataFlowCall call |
2461+
lambdaCall(call, _, node1) and
2462+
node2.getCall(TNormalReturnKind()) = call and
24632463
c.isDelegateCallReturn()
24642464
)
24652465
}

csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ public string ReturnField()
6464
}
6565

6666
public Func<object, object> MyFunction;
67-
// summary=Models;BasicFlow;false;MapMyFunction;(System.Object);;Argument[0];Argument[this];taint;df-generated
68-
// summary=Models;BasicFlow;false;MapMyFunction;(System.Object);;Argument[this];ReturnValue;taint;df-generated
67+
// summary=Models;BasicFlow;false;ApplyMyFunction;(System.Object);;Argument[0];Argument[this];taint;df-generated
68+
// summary=Models;BasicFlow;false;ApplyMyFunction;(System.Object);;Argument[this];ReturnValue;taint;df-generated
6969
// No content based flow as MaD doesn't support callback logic in fields and properties.
70-
public object MapMyFunction(object o)
70+
public object ApplyMyFunction(object o)
7171
{
7272
return MyFunction(o);
7373
}
@@ -517,18 +517,18 @@ public string M1(string s, Func<string, string> map)
517517
return s;
518518
}
519519

520-
// neutral=Models;HigherOrderParameters;Map;(System.Func<System.Object,System.Object>,System.Object);summary;df-generated
521-
// contentbased-summary=Models;HigherOrderParameters;false;Map;(System.Func<System.Object,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[0];value;dfc-generated
522-
// contentbased-summary=Models;HigherOrderParameters;false;Map;(System.Func<System.Object,System.Object>,System.Object);;Argument[0].ReturnValue;ReturnValue;value;dfc-generated
523-
public object Map(Func<object, object> f, object o)
520+
// neutral=Models;HigherOrderParameters;Apply;(System.Func<System.Object,System.Object>,System.Object);summary;df-generated
521+
// contentbased-summary=Models;HigherOrderParameters;false;Apply;(System.Func<System.Object,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[0];value;dfc-generated
522+
// contentbased-summary=Models;HigherOrderParameters;false;Apply;(System.Func<System.Object,System.Object>,System.Object);;Argument[0].ReturnValue;ReturnValue;value;dfc-generated
523+
public object Apply(Func<object, object> f, object o)
524524
{
525525
return f(o);
526526
}
527527

528-
// neutral=Models;HigherOrderParameters;Map2;(System.Object,System.Func<System.Object,System.Object,System.Object>);summary;df-generated
529-
// contentbased-summary=Models;HigherOrderParameters;false;Map2;(System.Object,System.Func<System.Object,System.Object,System.Object>);;Argument[0];Argument[1].Parameter[1];value;dfc-generated
530-
// contentbased-summary=Models;HigherOrderParameters;false;Map2;(System.Object,System.Func<System.Object,System.Object,System.Object>);;Argument[1].ReturnValue;ReturnValue;value;dfc-generated
531-
public object Map2(object o, Func<object, object, object> f)
528+
// neutral=Models;HigherOrderParameters;Apply2;(System.Object,System.Func<System.Object,System.Object,System.Object>);summary;df-generated
529+
// contentbased-summary=Models;HigherOrderParameters;false;Apply2;(System.Object,System.Func<System.Object,System.Object,System.Object>);;Argument[0];Argument[1].Parameter[1];value;dfc-generated
530+
// contentbased-summary=Models;HigherOrderParameters;false;Apply2;(System.Object,System.Func<System.Object,System.Object,System.Object>);;Argument[1].ReturnValue;ReturnValue;value;dfc-generated
531+
public object Apply2(object o, Func<object, object, object> f)
532532
{
533533
var x = f(null, o);
534534
return x;

shared/mad/codeql/mad/modelgenerator/internal/ModelGeneratorImpl.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,11 @@ module MakeModelGenerator<
631631
}
632632

633633
/**
634-
* Models as Data currently doesn't support callback logic in fields.
634+
* Holds if the access path `ap` is not a parameter or returnvalue of a callback
635+
* stored in a field.
636+
*
637+
* That is, we currently don't include summaries that rely on parameters or return values
638+
* of callbacks stored in fields.
635639
*/
636640
private predicate validateAccessPath(PropagateContentFlow::AccessPath ap) {
637641
not (mentionsField(ap) and mentionsCallback(ap))

0 commit comments

Comments
 (0)