GkvJwa wrote:

> Sorry for the repeated questions, but I'd really like to understand this 
> better :)
> 
> In #172287 @efriedma-quic said
> 
> > The basic issue here is that you can't generate unwind tables for both SEH 
> > and C++ exception handling in the same function.
> 
> That makes sense to me.
> 
> In our case, we are (as far as I'm aware) building with C++ exceptions 
> disabled, so that issue should not apply to us?
> 
> That's why I don't understand why this PR gates the 
> `err_seh_object_unwinding` diagnostic behind `getLangOpts().EHAsynch`. If the 
> problem is mixing SEH and C++ exceptions, why not gate it behind 
> `getLangOpts().CXXExceptions`?
> 
> > SEH is important for Windows, it can prevent many EXCEPTION_IN_PAGE_ERROR 
> > errors. **For LLVM, it only works when using /EHa**
> 
> My understanding was that LLVM has had SEH support for a long time, but only 
> for synchronous SEH exceptions. I.e. the following should work:
> 
> ```
> __try {
>   foo();  // Bad memory access in here.
> } __except(EXCEPTION_IN_PAGE_ERROR) {
>   // ...
> }
> ```
> 
> even without `/EHa` (as long as foo is not inlined)?
> 
> > This issue(#62606) can probably answer most questions. The key point is 
> > that the handling of SEH in LLVM is not quite the same as in MSVC. 
> > Currently, it can be said that with LLVM, the code within the __except 
> > block is only explicitly generated when using /eha.
> 
> IIUC that issue is about async SEH. We don't build with `/EHa`, but my 
> understanding was that synchronous SEH should still work?

I added this code(#62606) snippet to Chromium, and the crash still occurs even 
without `/EHa` enabled.
```
#include <stdio.h>
#include <windows.h>

int SafeFetch32(const int* adr, int errValue) {
  int v = 0;
  __try {
    v = *adr;
  } __except (EXCEPTION_EXECUTE_HANDLER) {
    printf("except\n");
    v = errValue;
  }
  return v;
}

// call this function
  SafeFetch32(0, -1);
```

There should be many similar codes in Chromium; for example, the code here also 
won't generate SEH information(like `_C_specific_handler`).
https://source.chromium.org/chromium/chromium/src/+/main:sandbox/win/src/process_thread_interception.cc;l=95

Of course, some code does indeed have SEH information because it meets certain 
conditions.

Since `/EHa` is not enabled(Can't open it either, has crash), it is impossible 
to determine exactly which parts are malfunctioning.

The `/EHa` in LLVM is not equivalent to C++ exceptions or MSVC's SEH, and the 
code still has many imperfections.

Ultimately, I prefer to provide a set of SEH parameters rather than putting SEH 
within `/EHa`(brought some problems)

https://github.com/llvm/llvm-project/pull/180108
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to