File tree 1 file changed +17
-2
lines changed 1 file changed +17
-2
lines changed Original file line number Diff line number Diff line change @@ -52,14 +52,29 @@ class FileWrapperCall extends DataFlow::CallCfgNode {
52
52
abstract class FileClose extends DataFlow:: CfgNode {
53
53
/** Holds if this file close will occur if an exception is thrown at `raises`. */
54
54
predicate guardsExceptions ( DataFlow:: CfgNode raises ) {
55
- this . asCfgNode ( ) = raises .asCfgNode ( ) .getAnExceptionalSuccessor ( ) . getASuccessor * ( )
55
+ cfgGetASuccessorStar ( raises .asCfgNode ( ) .getAnExceptionalSuccessor ( ) , this . asCfgNode ( ) )
56
56
or
57
57
// The expression is after the close call.
58
58
// This also covers the body of a `with` statement.
59
- raises .asCfgNode ( ) = this .asCfgNode ( ) . getASuccessor * ( )
59
+ cfgGetASuccessorStar ( this .asCfgNode ( ) , raises .asCfgNode ( ) )
60
60
}
61
61
}
62
62
63
+ private predicate cfgGetASuccessor ( ControlFlowNode src , ControlFlowNode sink ) {
64
+ sink = src .getASuccessor ( )
65
+ }
66
+
67
+ pragma [ inline]
68
+ private predicate cfgGetASuccessorPlus ( ControlFlowNode src , ControlFlowNode sink ) =
69
+ fastTC( cfgGetASuccessor / 2 ) ( src , sink )
70
+
71
+ pragma [ inline]
72
+ private predicate cfgGetASuccessorStar ( ControlFlowNode src , ControlFlowNode sink ) {
73
+ src = sink
74
+ or
75
+ cfgGetASuccessorPlus ( src , sink )
76
+ }
77
+
63
78
/** A call to the `.close()` method of a file object. */
64
79
class FileCloseCall extends FileClose {
65
80
FileCloseCall ( ) { exists ( DataFlow:: MethodCallNode mc | mc .calls ( this , "close" ) ) }
You can’t perform that action at this time.
0 commit comments