Skip to content

Commit a23e77c

Browse files
committed
Java: Disregard heap parameter in any-argument and any-parameter specs.
1 parent 9a4de20 commit a23e77c

File tree

12 files changed

+90
-18
lines changed

12 files changed

+90
-18
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,18 @@ module Private {
12221222
node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12231223
parameterMatch(ppos, apos)
12241224
|
1225-
c = "Argument" or parseArg(c, ppos)
1225+
c = "Argument" and not heapParameter(ppos)
1226+
or
1227+
parseArg(c, ppos)
12261228
)
12271229
or
12281230
exists(ArgumentPosition apos, ParameterPosition ppos |
12291231
node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and
12301232
parameterMatch(ppos, apos)
12311233
|
1232-
c = "Parameter" or parseParam(c, apos)
1234+
c = "Parameter" and not heapParameter(ppos)
1235+
or
1236+
parseParam(c, apos)
12331237
)
12341238
or
12351239
c = "ReturnValue" and
@@ -1259,7 +1263,9 @@ module Private {
12591263
node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12601264
parameterMatch(ppos, apos)
12611265
|
1262-
c = "Argument" or parseArg(c, ppos)
1266+
c = "Argument" and not heapParameter(ppos)
1267+
or
1268+
parseArg(c, ppos)
12631269
)
12641270
or
12651271
exists(ReturnNodeExt ret |

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,12 @@ predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) {
300300
)
301301
}
302302

303+
/**
304+
* Holds if `pos` is the position of the `heap` parameter, and thus should not
305+
* be included by models that specify "any argument" or "any parameter".
306+
*/
307+
predicate heapParameter(ParameterPosition pos) { none() }
308+
303309
/** Gets the argument position obtained by parsing `X` in `Parameter[X]`. */
304310
bindingset[s]
305311
ArgumentPosition parseParamBody(string s) {

go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,18 @@ module Private {
12221222
node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12231223
parameterMatch(ppos, apos)
12241224
|
1225-
c = "Argument" or parseArg(c, ppos)
1225+
c = "Argument" and not heapParameter(ppos)
1226+
or
1227+
parseArg(c, ppos)
12261228
)
12271229
or
12281230
exists(ArgumentPosition apos, ParameterPosition ppos |
12291231
node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and
12301232
parameterMatch(ppos, apos)
12311233
|
1232-
c = "Parameter" or parseParam(c, apos)
1234+
c = "Parameter" and not heapParameter(ppos)
1235+
or
1236+
parseParam(c, apos)
12331237
)
12341238
or
12351239
c = "ReturnValue" and
@@ -1259,7 +1263,9 @@ module Private {
12591263
node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12601264
parameterMatch(ppos, apos)
12611265
|
1262-
c = "Argument" or parseArg(c, ppos)
1266+
c = "Argument" and not heapParameter(ppos)
1267+
or
1268+
parseArg(c, ppos)
12631269
)
12641270
or
12651271
exists(ReturnNodeExt ret |

go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImplSpecific.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,12 @@ predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) {
251251
)
252252
}
253253

254+
/**
255+
* Holds if `pos` is the position of the `heap` parameter, and thus should not
256+
* be included by models that specify "any argument" or "any parameter".
257+
*/
258+
predicate heapParameter(ParameterPosition pos) { none() }
259+
254260
/**
255261
* Holds if specification component `c` parses as return value `n` or a range
256262
* containing `n`.

java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,18 @@ module Private {
12221222
node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12231223
parameterMatch(ppos, apos)
12241224
|
1225-
c = "Argument" or parseArg(c, ppos)
1225+
c = "Argument" and not heapParameter(ppos)
1226+
or
1227+
parseArg(c, ppos)
12261228
)
12271229
or
12281230
exists(ArgumentPosition apos, ParameterPosition ppos |
12291231
node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and
12301232
parameterMatch(ppos, apos)
12311233
|
1232-
c = "Parameter" or parseParam(c, apos)
1234+
c = "Parameter" and not heapParameter(ppos)
1235+
or
1236+
parseParam(c, apos)
12331237
)
12341238
or
12351239
c = "ReturnValue" and
@@ -1259,7 +1263,9 @@ module Private {
12591263
node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12601264
parameterMatch(ppos, apos)
12611265
|
1262-
c = "Argument" or parseArg(c, ppos)
1266+
c = "Argument" and not heapParameter(ppos)
1267+
or
1268+
parseArg(c, ppos)
12631269
)
12641270
or
12651271
exists(ReturnNodeExt ret |

java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,12 @@ predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) {
319319
)
320320
}
321321

322+
/**
323+
* Holds if `pos` is the position of the `heap` parameter, and thus should not
324+
* be included by models that specify "any argument" or "any parameter".
325+
*/
326+
predicate heapParameter(ParameterPosition pos) { pos = -2 }
327+
322328
/** Gets the argument position obtained by parsing `X` in `Parameter[X]`. */
323329
bindingset[s]
324330
ArgumentPosition parseParamBody(string s) {

python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,18 @@ module Private {
12221222
node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12231223
parameterMatch(ppos, apos)
12241224
|
1225-
c = "Argument" or parseArg(c, ppos)
1225+
c = "Argument" and not heapParameter(ppos)
1226+
or
1227+
parseArg(c, ppos)
12261228
)
12271229
or
12281230
exists(ArgumentPosition apos, ParameterPosition ppos |
12291231
node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and
12301232
parameterMatch(ppos, apos)
12311233
|
1232-
c = "Parameter" or parseParam(c, apos)
1234+
c = "Parameter" and not heapParameter(ppos)
1235+
or
1236+
parseParam(c, apos)
12331237
)
12341238
or
12351239
c = "ReturnValue" and
@@ -1259,7 +1263,9 @@ module Private {
12591263
node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12601264
parameterMatch(ppos, apos)
12611265
|
1262-
c = "Argument" or parseArg(c, ppos)
1266+
c = "Argument" and not heapParameter(ppos)
1267+
or
1268+
parseArg(c, ppos)
12631269
)
12641270
or
12651271
exists(ReturnNodeExt ret |

python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImplSpecific.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,12 @@ private module UnusedSourceSinkInterpretation {
241241

242242
/** Provides additional source specification logic. */
243243
predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode node) { none() }
244+
245+
/**
246+
* Holds if `pos` is the position of the `heap` parameter, and thus should not
247+
* be included by models that specify "any argument" or "any parameter".
248+
*/
249+
predicate heapParameter(ParameterPosition pos) { none() }
244250
}
245251

246252
import UnusedSourceSinkInterpretation

ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,18 @@ module Private {
12221222
node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12231223
parameterMatch(ppos, apos)
12241224
|
1225-
c = "Argument" or parseArg(c, ppos)
1225+
c = "Argument" and not heapParameter(ppos)
1226+
or
1227+
parseArg(c, ppos)
12261228
)
12271229
or
12281230
exists(ArgumentPosition apos, ParameterPosition ppos |
12291231
node.asNode().(ParamNode).isParameterOf(mid.asCallable(), ppos) and
12301232
parameterMatch(ppos, apos)
12311233
|
1232-
c = "Parameter" or parseParam(c, apos)
1234+
c = "Parameter" and not heapParameter(ppos)
1235+
or
1236+
parseParam(c, apos)
12331237
)
12341238
or
12351239
c = "ReturnValue" and
@@ -1259,7 +1263,9 @@ module Private {
12591263
node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and
12601264
parameterMatch(ppos, apos)
12611265
|
1262-
c = "Argument" or parseArg(c, ppos)
1266+
c = "Argument" and not heapParameter(ppos)
1267+
or
1268+
parseArg(c, ppos)
12631269
)
12641270
or
12651271
exists(ReturnNodeExt ret |

ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImplSpecific.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ private module UnusedSourceSinkInterpretation {
289289

290290
/** Provides additional source specification logic. */
291291
predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode node) { none() }
292+
293+
/**
294+
* Holds if `pos` is the position of the `heap` parameter, and thus should not
295+
* be included by models that specify "any argument" or "any parameter".
296+
*/
297+
predicate heapParameter(ParameterPosition pos) { none() }
292298
}
293299

294300
import UnusedSourceSinkInterpretation

0 commit comments

Comments
 (0)