[clang] [WinEH] Fix object delete crash (PR #180144)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 7 05:33:28 PST 2026
GkvJwa wrote:
@MuellerMP hello, I'm sorry to bother you again
We mentioned this sample earlier.
```
struct A {
~A();
};
void f() {
__try {
A* a = new A;
delete a;
} __finally {
}
}
```
At the time, I analyzed that it was caused by the insertion of an extra `llvm.seh.try.end()/invoke.cont7` instruction.
```
....
invoke.cont7: ; preds = %invoke.cont6
invoke void @llvm.seh.try.end()
to label %invoke.cont8 unwind label %ehcleanup10
.....
delete.end: ; preds = %invoke.cont9, %invoke.cont3
invoke void @llvm.seh.try.end()
to label %invoke.cont13 unwind label %ehcleanup14
...
```
Upon further analysis, I realized that the problem stemmed from inserting too many SEH calls within the same function context in the current framework.At the same time, the code generated by MSVC does not generate as many `__try` blocks as LLVM.
Then, I removed the `EmitSehTryScopeEnd` instruction from that location. At this point, LLVM is no longer crashing, and the generated code is also correct.
Therefore, the problem here might be that in the same block, multiple emits(`Emit*ScopeEnd`/`Emit*ScopeBegin`) are not needed on Windows when use '/eha'. The system mechanism shouldn't require multiple nested calls within the same stack(the same function)
I think this is somewhat related to this PR(#167176). So I'd like to ask for your opinion. We may need to ensure that we don't nest multiple handlers when `SEH` is enabled.
CC @rnk @efriedma-quic
https://github.com/llvm/llvm-project/pull/180144
More information about the cfe-commits
mailing list