Skip to content

[win] Fix truncated unwinds for Arm64 Windows#153202

Merged
rust-bors[bot] merged 1 commit intorust-lang:mainfrom
dpaoliello:arm64unwind
Mar 8, 2026
Merged

[win] Fix truncated unwinds for Arm64 Windows#153202
rust-bors[bot] merged 1 commit intorust-lang:mainfrom
dpaoliello:arm64unwind

Conversation

@dpaoliello
Copy link
Contributor

@dpaoliello dpaoliello commented Feb 27, 2026

Panic backtraces on ARM64 Windows are truncated because Rust's LLVM configuration sets NoTrapAfterNoreturn = true, which suppresses the generation of brk #0x1 (trap) instructions after calls to noreturn functions. Without this trap instruction, the return address from a noreturn call points past the end of the calling function into an unrelated function, causing RtlLookupFunctionEntry to return the wrong unwind information, which terminates the stack walk prematurely.

In general, NoTrapAfterNoreturn = true is recommended against for Windows, since we have seen security vulnerabilities in the past where an attacker has managed to return from a noreturn function, or the function wasn't actually noereturn, resulting in executing whatever was after the call.

This change disables setting NoTrapAfterNoreturn = true for Windows.

Fixes #140489

@rustbot rustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Feb 27, 2026
@rustbot
Copy link
Collaborator

rustbot commented Feb 27, 2026

r? @cuviper

rustbot has assigned @cuviper.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @cuviper

Copy link
Member

@cuviper cuviper left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still wonder why we don't subtract 1 in backtrace-rs, as suggested in the issue, but I guess this change is still fine if other unwinders need it.

@bors r+

View changes since this review

@@ -347,7 +347,13 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
// option causes bugs in the LLVM WebAssembly backend. You should be able to
// remove this check when Rust's minimum supported LLVM version is >= 18
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose we could try wasm again now, but not in this PR of course...

@rust-bors
Copy link
Contributor

rust-bors bot commented Mar 7, 2026

📌 Commit 614bac5 has been approved by cuviper

It is now in the queue for this repository.

@rust-bors rust-bors bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Mar 7, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Mar 7, 2026
[win] Fix truncated unwinds for Arm64 Windows

Panic backtraces on ARM64 Windows are truncated because Rust's LLVM configuration sets `NoTrapAfterNoreturn = true`, which suppresses the generation of `brk #0x1` (trap) instructions after calls to `noreturn` functions. Without this trap instruction, the return address from a `noreturn` call points past the end of the calling function into an unrelated function, causing `RtlLookupFunctionEntry` to return the wrong unwind information, which terminates the stack walk prematurely.

In general, `NoTrapAfterNoreturn = true` is recommended against for Windows, since we have seen security vulnerabilities in the past where an attacker has managed to return from a noreturn function, or the function wasn't actually noereturn, resulting in executing whatever was after the call.

This change disables setting `NoTrapAfterNoreturn = true` for Windows.

Fixes rust-lang#140489
rust-bors bot pushed a commit that referenced this pull request Mar 8, 2026
Rollup of 4 pull requests

Successful merges:

 - #153202 ([win] Fix truncated unwinds for Arm64 Windows)
 - #153437 (coretest in miri: fix using unstable libtest features)
 - #153446 (Always use the ThinLTO pipeline for pre-link optimizations)
 - #153548 (add test for closure precedence in `TokenStream`s)
@rust-bors rust-bors bot merged commit 4400f2f into rust-lang:main Mar 8, 2026
11 checks passed
@rustbot rustbot added this to the 1.96.0 milestone Mar 8, 2026
rust-timer added a commit that referenced this pull request Mar 8, 2026
Rollup merge of #153202 - dpaoliello:arm64unwind, r=cuviper

[win] Fix truncated unwinds for Arm64 Windows

Panic backtraces on ARM64 Windows are truncated because Rust's LLVM configuration sets `NoTrapAfterNoreturn = true`, which suppresses the generation of `brk #0x1` (trap) instructions after calls to `noreturn` functions. Without this trap instruction, the return address from a `noreturn` call points past the end of the calling function into an unrelated function, causing `RtlLookupFunctionEntry` to return the wrong unwind information, which terminates the stack walk prematurely.

In general, `NoTrapAfterNoreturn = true` is recommended against for Windows, since we have seen security vulnerabilities in the past where an attacker has managed to return from a noreturn function, or the function wasn't actually noereturn, resulting in executing whatever was after the call.

This change disables setting `NoTrapAfterNoreturn = true` for Windows.

Fixes #140489
@dpaoliello dpaoliello deleted the arm64unwind branch March 9, 2026 17:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Panic backtrace on Arm64 Windows is truncated

3 participants