Skip to content

Commit 37fb27f

Browse files
committed
Python: change type of LibraryCallable::getACall
The other callables return control flow nodes, so it is slightly inconsistent for this to return a data flow node, but it does make models based on API graphs nicer.
1 parent 33b508d commit 37fb27f

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

python/ql/lib/semmle/python/dataflow/new/FlowSummary.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ private class SummarizedCallableFromModel extends SummarizedCallable {
8484
this = package + ";" + type + ";" + path
8585
}
8686

87-
override CallNode getACall() {
87+
override CallCfgNode getACall() {
8888
exists(API::CallNode base |
8989
ModelOutput::resolvedSummaryBase(package, type, path, base) and
90-
result = base.asCfgNode()
90+
result = base.getACall()
9191
)
9292
}
9393

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ abstract class LibraryCallable extends string {
281281
LibraryCallable() { any() }
282282

283283
/** Gets a call to this library callable. */
284-
abstract CallNode getACall();
284+
abstract CallCfgNode getACall();
285285

286286
/** Gets a data-flow node, where this library callable is used as a call-back. */
287287
abstract ArgumentNode getACallback();
@@ -398,7 +398,7 @@ class LibraryCallableValue extends DataFlowCallable, TLibraryCallable {
398398

399399
override string toString() { result = callable.toString() }
400400

401-
override CallNode getACall() { result = callable.getACall() }
401+
override CallNode getACall() { result = callable.getACall().getNode() }
402402

403403
/** Gets a data-flow node, where this library callable is used as a call-back. */
404404
ArgumentNode getACallback() { result = callable.getACallback() }
@@ -772,7 +772,7 @@ DataFlowCallable viableCallable(DataFlowSourceCall call) {
772772
// Instead we reolve the call from the summary.
773773
exists(LibraryCallable callable |
774774
result = TLibraryCallable(callable) and
775-
call.getNode() = callable.getACall()
775+
call.getNode() = callable.getACall().getNode()
776776
)
777777
}
778778

python/ql/lib/semmle/python/frameworks/Builtins.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ private import semmle.python.ApiGraphs
1010
class ReversedSummary extends SummarizedCallable {
1111
ReversedSummary() { this = "builtins.reversed" }
1212

13-
override CallNode getACall() { result = API::builtin("reversed").getACall().getNode() }
13+
override DataFlow::CallCfgNode getACall() { result = API::builtin("reversed").getACall() }
1414

1515
override DataFlow::ArgumentNode getACallback() {
1616
result = API::builtin("reversed").getAValueReachableFromSource()

python/ql/test/experimental/dataflow/summaries/TestSummaries.qll

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ module RecursionGuard {
1313
private class RecursionGuard extends SummarizedCallable {
1414
RecursionGuard() { this = "RecursionGuard" }
1515

16-
override CallNode getACall() {
17-
result.getFunction().(NameNode).getId() = this and
16+
override DataFlow::CallCfgNode getACall() {
17+
result.getFunction().asCfgNode().(NameNode).getId() = this and
1818
(TT::callStep(_, _) implies any())
1919
}
2020

@@ -25,7 +25,9 @@ module RecursionGuard {
2525
private class SummarizedCallableIdentity extends SummarizedCallable {
2626
SummarizedCallableIdentity() { this = "identity" }
2727

28-
override CallNode getACall() { result.getFunction().(NameNode).getId() = this }
28+
override DataFlow::CallCfgNode getACall() {
29+
result.getFunction().asCfgNode().(NameNode).getId() = this
30+
}
2931

3032
override DataFlow::ArgumentNode getACallback() { result.asExpr().(Name).getId() = this }
3133

@@ -40,7 +42,9 @@ private class SummarizedCallableIdentity extends SummarizedCallable {
4042
private class SummarizedCallableApplyLambda extends SummarizedCallable {
4143
SummarizedCallableApplyLambda() { this = "apply_lambda" }
4244

43-
override CallNode getACall() { result.getFunction().(NameNode).getId() = this }
45+
override DataFlow::CallCfgNode getACall() {
46+
result.getFunction().asCfgNode().(NameNode).getId() = this
47+
}
4448

4549
override DataFlow::ArgumentNode getACallback() { result.asExpr().(Name).getId() = this }
4650

@@ -58,7 +62,9 @@ private class SummarizedCallableApplyLambda extends SummarizedCallable {
5862
private class SummarizedCallableReversed extends SummarizedCallable {
5963
SummarizedCallableReversed() { this = "reversed" }
6064

61-
override CallNode getACall() { result.getFunction().(NameNode).getId() = this }
65+
override DataFlow::CallCfgNode getACall() {
66+
result.getFunction().asCfgNode().(NameNode).getId() = this
67+
}
6268

6369
override DataFlow::ArgumentNode getACallback() { result.asExpr().(Name).getId() = this }
6470

@@ -72,7 +78,9 @@ private class SummarizedCallableReversed extends SummarizedCallable {
7278
private class SummarizedCallableMap extends SummarizedCallable {
7379
SummarizedCallableMap() { this = "list_map" }
7480

75-
override CallNode getACall() { result.getFunction().(NameNode).getId() = this }
81+
override DataFlow::CallCfgNode getACall() {
82+
result.getFunction().asCfgNode().(NameNode).getId() = this
83+
}
7684

7785
override DataFlow::ArgumentNode getACallback() { result.asExpr().(Name).getId() = this }
7886

@@ -90,7 +98,9 @@ private class SummarizedCallableMap extends SummarizedCallable {
9098
private class SummarizedCallableAppend extends SummarizedCallable {
9199
SummarizedCallableAppend() { this = "append_to_list" }
92100

93-
override CallNode getACall() { result.getFunction().(NameNode).getId() = this }
101+
override DataFlow::CallCfgNode getACall() {
102+
result.getFunction().asCfgNode().(NameNode).getId() = this
103+
}
94104

95105
override DataFlow::ArgumentNode getACallback() { result.asExpr().(Name).getId() = this }
96106

@@ -108,8 +118,8 @@ private class SummarizedCallableAppend extends SummarizedCallable {
108118
private class SummarizedCallableJsonLoads extends SummarizedCallable {
109119
SummarizedCallableJsonLoads() { this = "json.loads" }
110120

111-
override CallNode getACall() {
112-
result = API::moduleImport("json").getMember("loads").getACall().getNode()
121+
override DataFlow::CallCfgNode getACall() {
122+
result = API::moduleImport("json").getMember("loads").getACall()
113123
}
114124

115125
override DataFlow::ArgumentNode getACallback() {

0 commit comments

Comments
 (0)