mirror of
https://github.com/github/codeql.git
synced 2026-04-22 15:25:18 +02:00
C++: Add LeaveStmt class
This commit is contained in:
@@ -841,6 +841,41 @@ private Stmt getEnclosingBreakable(Stmt s) {
|
||||
else result = getEnclosingBreakable(s.getParent().getEnclosingStmt())
|
||||
}
|
||||
|
||||
/**
|
||||
* A Microsoft C/C++ `__leave` statement.
|
||||
*
|
||||
* For example, the `__leave` statement in the following code:
|
||||
* ```
|
||||
* __try {
|
||||
* if (err) __leave;
|
||||
* ...
|
||||
* }
|
||||
* __finally {
|
||||
*
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
class LeaveStmt extends JumpStmt, @stmt_leave {
|
||||
override string getAPrimaryQlClass() { result = "LeaveStmt" }
|
||||
|
||||
override string toString() { result = "__leave;" }
|
||||
|
||||
override predicate mayBeImpure() { none() }
|
||||
|
||||
override predicate mayBeGloballyImpure() { none() }
|
||||
|
||||
/**
|
||||
* Gets the `__try` statement that this `__leave` exits.
|
||||
*/
|
||||
MicrosoftTryStmt getEnclosingTry() { result = getEnclosingTry(this) }
|
||||
}
|
||||
|
||||
private MicrosoftTryStmt getEnclosingTry(Stmt s) {
|
||||
if s.getParent().getEnclosingStmt() instanceof MicrosoftTryStmt
|
||||
then result = s.getParent().getEnclosingStmt()
|
||||
else result = getEnclosingTry(s.getParent().getEnclosingStmt())
|
||||
}
|
||||
|
||||
/**
|
||||
* A C/C++ 'label' statement.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user