Skip to content

Commit f6fa707

Browse files
committed
C++: Add LeaveStmt class
1 parent 7a4de55 commit f6fa707

File tree

1 file changed

+35
-0
lines changed
  • cpp/ql/lib/semmle/code/cpp/stmts

1 file changed

+35
-0
lines changed

cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff 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
*

0 commit comments

Comments
 (0)