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) {
841841 else result = getEnclosingBreakable ( s .getParent ( ) .getEnclosingStmt ( ) )
842842}
843843
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+
844879/**
845880 * A C/C++ 'label' statement.
846881 *
You can’t perform that action at this time.
0 commit comments