Skip to content

Commit 2fd9b16

Browse files
Attempt performance improvement for fileLocalFlow
1 parent d23c3b8 commit 2fd9b16

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

python/ql/src/Resources/FileNotAlwaysClosedQuery.qll

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,28 @@ private predicate mayRaiseWithFile(DataFlow::CfgNode file, DataFlow::CfgNode rai
8484
}
8585

8686
/** Holds if data flows from `nodeFrom` to `nodeTo` in one step that also includes file wrapper classes. */
87-
private predicate fileLocalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
88-
DataFlow::localFlowStep(nodeFrom, nodeTo)
89-
or
87+
private predicate fileAdditionalLocalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
9088
exists(FileWrapperCall fw | nodeFrom = fw.getWrapped() and nodeTo = fw)
9189
}
9290

91+
private predicate fileLocalFlowHelper0(
92+
DataFlow::LocalSourceNode nodeFrom, DataFlow::LocalSourceNode nodeTo
93+
) {
94+
exists(DataFlow::Node nodeMid |
95+
nodeFrom.flowsTo(nodeMid) and fileAdditionalLocalFlowStep(nodeMid, nodeTo)
96+
)
97+
}
98+
99+
private predicate fileLocalFlowHelper1(
100+
DataFlow::LocalSourceNode nodeFrom, DataFlow::LocalSourceNode nodeTo
101+
) {
102+
fileLocalFlowHelper0*(nodeFrom, nodeTo)
103+
}
104+
93105
/** Holds if data flows from `source` to `sink`, including file wrapper classes. */
94-
private predicate fileLocalFlow(DataFlow::Node source, DataFlow::Node sink) {
95-
fileLocalFlowStep*(source, sink)
106+
pragma[inline]
107+
private predicate fileLocalFlow(FileOpen source, DataFlow::Node sink) {
108+
exists(DataFlow::LocalSourceNode mid | fileLocalFlowHelper1(source, mid) and mid.flowsTo(sink))
96109
}
97110

98111
/** Holds if the file opened at `fo` is closed. */

0 commit comments

Comments
 (0)