https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118263

            Bug ID: 118263
           Summary: Compiler should issue a warning when passing function
                    pointers not marked noexcept to functions where
                    throwing an exception in a callback function is
                    undefined behavior
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: richard.yao at alumni dot stonybrook.edu
  Target Milestone: ---

The unity blog describes an interesting bug that occurred on Windows:

https://unity.com/blog/engine-platform/debugging-memory-debugging-memory-corruption-who-wrote-2-into-my-stack-who-the-hell

Thread A blocked in select(), which is a wrapper around
WaitForSingleObjectEx(). Thread B called QueueUserAPC(), which interrupted
Thread A to run a callback function. The callback function then threw an
exception, causing the stack to unwind, while the kernel had yet to respond to
the select() call. When it finally did respond to the select call, the stack
frame was gone due to C++ stack unwinding, and WAIT_TIMEOUT (0x00000102L) was
written to the stack, causing stack corruption.

WaitForSingleObjectEx() is a C ABI function and thus invoking a C++ exception
in it triggers undefined behavior. The compiler should issue a warning when
passing a function pointer not marked noexcept to a C ABI function, but does
not:

https://godbolt.org/z/14ocshsE5

Similarly, the compiler should warn about passing a function pointer to a
function not marked noexcept to a function marked noexcept, but does not:

https://godbolt.org/z/rjPfYjnzf

Reply via email to