File tree Expand file tree Collapse file tree 1 file changed +35
-0
lines changed
cpp/ql/lib/semmle/code/cpp/stmts Expand file tree Collapse file tree 1 file changed +35
-0
lines changed Original file line number Diff line number Diff line change @@ -841,6 +841,41 @@ private Stmt getEnclosingBreakable(Stmt s) {
841
841
else result = getEnclosingBreakable ( s .getParent ( ) .getEnclosingStmt ( ) )
842
842
}
843
843
844
+ /**
845
+ * A Microsoft C/C++ `__leave` statement.
846
+ *
847
+ * For example, the `__leave` statement in the following code:
848
+ * ```
849
+ * __try {
850
+ * if (err) __leave;
851
+ * ...
852
+ * }
853
+ * __finally {
854
+ *
855
+ * }
856
+ * ```
857
+ */
858
+ class LeaveStmt extends JumpStmt , @stmt_leave {
859
+ override string getAPrimaryQlClass ( ) { result = "LeaveStmt" }
860
+
861
+ override string toString ( ) { result = "__leave;" }
862
+
863
+ override predicate mayBeImpure ( ) { none ( ) }
864
+
865
+ override predicate mayBeGloballyImpure ( ) { none ( ) }
866
+
867
+ /**
868
+ * Gets the `__try` statement that this `__leave` exits.
869
+ */
870
+ MicrosoftTryStmt getEnclosingTry ( ) { result = getEnclosingTry ( this ) }
871
+ }
872
+
873
+ private MicrosoftTryStmt getEnclosingTry ( Stmt s ) {
874
+ if s .getParent ( ) .getEnclosingStmt ( ) instanceof MicrosoftTryStmt
875
+ then result = s .getParent ( ) .getEnclosingStmt ( )
876
+ else result = getEnclosingTry ( s .getParent ( ) .getEnclosingStmt ( ) )
877
+ }
878
+
844
879
/**
845
880
* A C/C++ 'label' statement.
846
881
*
You can’t perform that action at this time.
0 commit comments