• Andreas Haas's avatar
    [wasm][asan][windows] Reset thread-in-wasm flag in memory_fill_wrapper · 2ca2f370
    Andreas Haas authored
    ASAN on Windows uses exceptions to manage its shadow memory. However,
    this behavior can conflict with WebAssembly trap handler, because
    WebAssembly trap handler are executed before the ASAN exception handler.
    
    For some WebAssembly instructions we do not generate assembly code but
    call to C functions instead. Since these functions are very simple, we
    do not want to reset the thread-in-wasm flag before calling them.
    However, when these functions trigger the ASAN exceptions, the
    thread-in-wasm flag gets out-of-sync. This happened for the
    memory_fill_wrapper function. Originally we thought that it's sufficient
    to just mark the function with DISABLE_ASAN. However, this is not enough
    because clang compiles the function to use memset, and memset gets
    replaced by ASAN with asan_memset.
    
    Therefore I decided now that just for sanitizer builds on Windows, we
    reset the thread-in-wasm flag in memory_fill_wrapper. This is not ideal
    because it's test-specific code within production code. However, the
    alternatives also don't sound convincing.
    
    Alternatives would be:
    * Resetting the thread-in-wasm flag whenever we call a c-function
      - This would be unnecessary performance overhead for production code
        just to make a test work.
    * Configure ASAN to not change memset.
      - This would weaken ASAN also for other cases.
    * Disable ASAN for trap handlers, or trap handlers in ASAN builds.
      - This would reduce test coverage.
    
    R=binji@chromium.org
    
    Bug: chromium:957405
    Change-Id: Ibd13c6fe7b898238f636db576552e3e4b278c04a
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1617671
    Commit-Queue: Andreas Haas <ahaas@chromium.org>
    Reviewed-by: 's avatarBen Smith <binji@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#61658}
    2ca2f370
Name
Last commit
Last update
benchmarks Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
COMMON_OWNERS Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
ENG_REVIEW_OWNERS Loading commit data...
INFRA_OWNERS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...