Skip to content

Commit 70647ce

Browse files
authored
Merge pull request #19734 from github/idrissrio/goto
C++: Add support to `__leave`
2 parents 0a6d884 + 7af8287 commit 70647ce

File tree

14 files changed

+10821
-754
lines changed

14 files changed

+10821
-754
lines changed

cpp/downgrades/a8c2176e9a5cf9be8d17053a4c8e7e56b5aced6d/old.dbscheme

Lines changed: 2494 additions & 0 deletions
Large diffs are not rendered by default.

cpp/downgrades/a8c2176e9a5cf9be8d17053a4c8e7e56b5aced6d/semmlecode.cpp.dbscheme

Lines changed: 2493 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Stmt extends @stmt {
2+
string toString() { none() }
3+
}
4+
5+
class Location extends @location_stmt {
6+
string toString() { none() }
7+
}
8+
9+
from Stmt id, int kind, Location loc, int new_kind
10+
where
11+
stmts(id, kind, loc) and
12+
if kind = 40 then new_kind = 4 else new_kind = kind
13+
select id, new_kind, loc
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
description: Support `__leave` statement
2+
compatibility: full
3+
stmts.rel: run stmts.qlo
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: feature
3+
---
4+
* The Microsoft-specific `__leave` statement is now supported.
5+
* A new class `LeaveStmt` extending `JumpStmt` was added to represent `__leave` statements.

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
*

cpp/ql/lib/semmlecode.cpp.dbscheme

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2213,6 +2213,7 @@ case @stmt.kind of
22132213
| 37 = @stmt_co_return
22142214
| 38 = @stmt_consteval_if
22152215
| 39 = @stmt_not_consteval_if
2216+
| 40 = @stmt_leave
22162217
;
22172218

22182219
type_vla(
@@ -2349,7 +2350,7 @@ blockscope(
23492350
int enclosing: @parameterized_element ref
23502351
);
23512352

2352-
@jump = @stmt_goto | @stmt_break | @stmt_continue;
2353+
@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave;
23532354

23542355
@jumporlabel = @jump | @stmt_label | @literal;
23552356

0 commit comments

Comments
 (0)