Skip to content

Commit b7e36b7

Browse files
committed
C#: Re-factor NoDisposeCallOnLocalIDisposable to use the new API.
1 parent 5580023 commit b7e36b7

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@ private class ReturnNode extends DataFlow::ExprNode {
2424
}
2525
}
2626

27-
private class Conf extends DataFlow::Configuration {
28-
Conf() { this = "NoDisposeCallOnLocalIDisposable" }
29-
30-
override predicate isSource(DataFlow::Node node) {
27+
module DisposeCallOnLocalIDisposableConfig implements DataFlow::ConfigSig {
28+
predicate isSource(DataFlow::Node node) {
3129
node.asExpr() =
3230
any(LocalScopeDisposableCreation disposable |
3331
// Only care about library types - user types often have spurious IDisposable declarations
@@ -37,7 +35,7 @@ private class Conf extends DataFlow::Configuration {
3735
)
3836
}
3937

40-
override predicate isSink(DataFlow::Node node) {
38+
predicate isSink(DataFlow::Node node) {
4139
// Things that return may be disposed elsewhere
4240
node instanceof ReturnNode
4341
or
@@ -80,23 +78,27 @@ private class Conf extends DataFlow::Configuration {
8078
)
8179
}
8280

83-
override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
81+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
8482
node2.asExpr() =
8583
any(LocalScopeDisposableCreation other | other.getAnArgument() = node1.asExpr())
8684
}
8785

88-
override predicate isBarrierOut(DataFlow::Node node) {
89-
this.isSink(node) and
86+
predicate isBarrierOut(DataFlow::Node node) {
87+
isSink(node) and
9088
not node instanceof ReturnNode
9189
}
9290
}
9391

92+
module DisposeCallOnLocalIDisposable = DataFlow::Global<DisposeCallOnLocalIDisposableConfig>;
93+
9494
/** Holds if `disposable` may not be disposed. */
9595
predicate mayNotBeDisposed(LocalScopeDisposableCreation disposable) {
96-
exists(Conf conf, DataFlow::ExprNode e |
96+
exists(DataFlow::ExprNode e |
9797
e.getExpr() = disposable and
98-
conf.isSource(e) and
99-
not exists(DataFlow::Node sink | conf.hasFlow(DataFlow::exprNode(disposable), sink) |
98+
DisposeCallOnLocalIDisposableConfig::isSource(e) and
99+
not exists(DataFlow::Node sink |
100+
DisposeCallOnLocalIDisposable::flow(DataFlow::exprNode(disposable), sink)
101+
|
100102
sink instanceof ReturnNode
101103
implies
102104
sink.getEnclosingCallable() = disposable.getEnclosingCallable()

0 commit comments

Comments
 (0)