Skip to content
  1. Jul 15, 2023
    • comex's avatar
      Fixes and workarounds to make UBSan happier on macOS · d7c532d8
      comex authored
      There are still some other issues not addressed here, but it's a start.
      
      Workarounds for false-positive reports:
      
      - `RasterizerAccelerated`: Put a gigantic array behind a `unique_ptr`,
        because UBSan has a [hardcoded limit](https://stackoverflow.com/questions/64531383/c-runtime-error-using-fsanitize-undefined-object-has-a-possibly-invalid-vp)
        of how big it thinks objects can be, specifically when dealing with
        offset-to-top values used with multiple inheritance.  Hopefully this
        doesn't have a performance impact.
      
      - `QueryCacheBase::QueryCacheBase`: Avoid an operation that UBSan thinks
        is UB even though it at least arguably isn't.  See the link in the
        comment for more information.
      
      Fixes for correct reports:
      
      - `PageTable`, `Memory`: Use `uintptr_t` values instead of pointers to
        avoid UB from pointer overflow (when pointer arithmetic wraps around
        the address space).
      
      - `KScheduler::Reload`: `thread->GetOwnerProcess()` can be `nullptr`;
        avoid calling methods on it in this case.  (The existing code returns
        a garbage reference to a field, which is then passed into
        `LoadWatchpointArray`, and apparently it's never used, so it's
        harmless in practice but still triggers UBSan.)
      
      - `KAutoObject::Close`: This function calls `this->Destroy()`, which
        overwrites the beginning of the object with junk (specifically a free
        list pointer).  Then it calls `this->UnregisterWithKernel()`.  UBSan
        complains about a type mismatch because the vtable has been
        overwritten, and I believe this is indeed UB.  `UnregisterWithKernel`
        also loads `m_kernel` from the 'freed' object, which seems to be
        technically safe (the overwriting doesn't extend as far as that
        field), but seems dubious.  Switch to a `static` method and load
        `m_kernel` in advance.
      d7c532d8
  2. Jul 12, 2023
  3. Jul 11, 2023
  4. Jul 10, 2023
  5. Jul 09, 2023
  6. Jul 08, 2023
  7. Jul 07, 2023
  8. Jul 06, 2023
  9. Jul 05, 2023
  10. Jul 04, 2023
Loading