Bug 21443 – scope (failure) with a return breaks safety

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2020-12-02T11:15:37Z
Last change time
2024-03-27T17:10:19Z
Keywords
pull, safe, spec
Assigned to
No Owner
Creator
Andrej Mitrovic
See also
https://issues.dlang.org/show_bug.cgi?id=24460

Comments

Comment #0 by andrej.mitrovich — 2020-12-02T11:15:37Z
----- ulong get () @safe nothrow { scope (failure) return 10; throw new Error(""); } void main () @safe { assert(get() == 10); // passes } ----- It should not be allowed to do a `return` inside of a `scope (failure)`, because currently scope failure also handles Errors. In this case any Error thrown is not re-thrown, and the function simply returns a value. That's a big hole in safety IMO.
Comment #1 by schveiguy — 2022-06-08T01:35:18Z
I concur. Recently came up on the forums in response to a blog post I made: https://forum.dlang.org/post/[email protected] Since an Error does not necessarily properly unwind the stack, just returning a normal error code doesn't reflect the gravity of the situation -- you should not be allowed to swallow Errors and continue. My suggestion would be to rewrite the scope(failure) code as: ```d try { ... } catch(Error err) { // return 10; // not allowed abort("Cannot return from thrown Error"); } catch(Throwable) { return 10; } ``` Which would allow code to still compile, but not allow Undefined Behavior. I would suggest this still happen even inside @system code. If you want to circumvent, write out the try/catch yourself. I'd also be OK with Andrej's suggestion (no return inside scope(failure), or anything like it, such as a goto outside the block). I should note, the spec specifically allows this, as it forbids returns inside scope(exit) and scope(success), but purposefully leaves out scope(failure).
Comment #2 by dlang-bot — 2022-07-05T14:09:16Z
@RazvanN7 created dlang/dmd pull request #14269 "Fix Issue 21443 - scope (failure) with a return breaks safety" fixing this issue: - Fix Issue 21443 - scope (failure) with a return breaks safety https://github.com/dlang/dmd/pull/14269
Comment #3 by dlang-bot — 2022-07-07T14:18:17Z
dlang/dmd pull request #14269 "Fix Issue 21443 - scope (failure) with a return breaks safety" was merged into stable: - 8ea4610d83d9c4b7aebc2ea52514885c02ef193d by RazvanN7: Fix Issue 21443 - scope (failure) with a return breaks safety https://github.com/dlang/dmd/pull/14269
Comment #4 by dlang-bot — 2022-07-09T16:31:52Z
dlang/dmd pull request #14280 "merge stable" was merged into master: - 2c336dfa825c481f0a32f495ce26232e45d820a4 by RazvanN7: Fix Issue 21443 - scope (failure) with a return breaks safety https://github.com/dlang/dmd/pull/14280