Fantom's tester holds two copies of jsi, libjsi.so and the one Hermes's host build compiles into libhermesvm.so (ASan: odr-violation)

Aperta
#59,669 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
55/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
cmake, cpp, docker, react-native
Ambito
build-system

Direzione di ricerca

Start from hermes-engine/build.gradle.kts and configureBuildForHermesCommandLineArgs, which should pass -DHERMES_BUILD_SHARED_JSI=True for host build like Android. Reproduce via ./fantom/reproduce.sh asan-jsi-twice in the Docker reproducer. Done means the tester runs under ASan without the odr-violation on jsi globals.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Description

Fantom's tester links React Native's jsi target (ReactCommon/jsi, a shared library) and libhermesvm.so. Hermes's host build, configureBuildForHermesCommandLineArgs in hermes-engine/build.gradle.kts, passes no HERMES_BUILD_SHARED_JSI, so Hermes compiles jsi.cpp from the same JSI_DIR into libhermesvm.so and exports it, and the tester's process holds two copies of jsi's code and globals. The Android build passes -DHERMES_BUILD_SHARED_JSI=True and links one shared jsi.

Built with Hermes and the tester under AddressSanitizer, the tester stops before its first test on an odr-violation for jsi's globals, defined once in libhermesvm.so and once in the tester's libjsi.so.

Steps to reproduce
  1. git clone https://github.com/YevheniiKotyrlo/react-native-fantom-reproducer && cd react-native-fantom-reproducer
  2. ./fantom/reproduce.sh asan-jsi-twice (needs Docker). It clones react/react-native at main, adds folly/memory/SanitizeLeak.cpp to the tester's folly (#59668), builds Hermes and the tester under AddressSanitizer, and runs packages/react-native/Libraries/Components/View/__tests__/View-itest.js.

The same on a checkout of main, with folly/memory/SanitizeLeak.cpp added to folly_runtime_SRC in private/react-native-fantom/tester/third-party/folly/CMakeLists.txt:

export CFLAGS="-fsanitize=address -fno-omit-frame-pointer"
export CXXFLAGS="-fsanitize=address -fno-omit-frame-pointer -Wno-error=deprecated-literal-operator"
export LDFLAGS="-fuse-ld=lld -fsanitize=address"
yarn workspace @react-native/fantom build
yarn fantom packages/react-native/Libraries/Components/View/__tests__/View-itest.js

The flags reach Hermes's CMake as well as the tester's, so both are instrumented.

Expected: one copy of jsi in the tester's process, so View-itest.js runs its tests under AddressSanitizer.

Seen: the tester stops before its first test on an AddressSanitizer odr-violation for typeinfo name for facebook::jsi::JSError, defined in both libhermesvm.so and the tester's libjsi.so (the log under Stacktrace or Logs).

React Native Version

0.88.0 (reproduced on main at 54905a2)

Affected Platforms

Build - Linux

Output of npx @react-native-community/cli info
System:
  OS: Linux 6.18 Ubuntu 22.04.5 LTS 22.04.5 LTS (Jammy Jellyfish)
  CPU: (24) x64 AMD Ryzen 9 9950X3D 16-Core Processor
  Memory: 116.43 GB / 125.63 GB
  Shell:
    version: 5.1.16
    path: /bin/bash
Binaries:
  Node:
    version: 22.14.0
    path: /usr/local/bin/node
  Yarn:
    version: 1.22.22
    path: /usr/local/bin/yarn
  npm:
    version: 10.9.2
    path: /usr/local/bin/npm
  Watchman: Not Found
SDKs:
  Android SDK:
    API Levels:
      - "37"
    Build Tools:
      - 37.0.0
    Android NDK: 28.2.13676358
IDEs:
  Android Studio: Not Found
Languages:
  Java:
    version: 17.0.20.1
    path: /usr/bin/javac
  Ruby:
    version: 3.0.2
    path: /usr/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react: Not Found
  react-native: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found
Stacktrace or Logs
==7959==ERROR: AddressSanitizer: odr-violation (0x75bdfd4d9a40):
  [1] size=24 'typeinfo name for facebook::jsi::JSError' /react-native/packages/react-native/ReactCommon/jsi/jsi/jsi.cpp in /react-native/packages/react-native/ReactAndroid/hermes-engine/build/hermes/lib/libhermesvm.so
  [2] size=24 'typeinfo name for facebook::jsi::JSError' /react-native/packages/react-native/ReactCommon/jsi/jsi/jsi.cpp in /react-native/private/react-native-fantom/build/tester/ReactCommon/jsi/libjsi.so
These globals were registered at these points:
  [1]:
    #0 0x5784ae158509 in __asan_register_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:431:3
    #1 0x5784ae159639 in __asan_register_elf_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:414:3
    #2 0x75bdfdefe47d  (/lib64/ld-linux-x86-64.so.2+0x647d) (BuildId: e6d3f5d4f2a24a5464ab59ae321b9474d70410f8)

  [2]:
    #0 0x5784ae158509 in __asan_register_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:431:3
    #1 0x5784ae159639 in __asan_register_elf_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:414:3
    #2 0x75bdfdefe47d  (/lib64/ld-linux-x86-64.so.2+0x647d) (BuildId: e6d3f5d4f2a24a5464ab59ae321b9474d70410f8)

==7959==HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_odr_violation=0
SUMMARY: AddressSanitizer: odr-violation: global 'typeinfo name for facebook::jsi::JSError' at /react-native/packages/react-native/ReactCommon/jsi/jsi/jsi.cpp in /react-native/packages/react-native/ReactAndroid/hermes-engine/build/hermes/lib/libhermesvm.so
MANDATORY Reproducer

https://github.com/YevheniiKotyrlo/react-native-fantom-reproducer

Screenshots and Videos

No response

Lingua principale
C++
Stelle
127k
Fork
25.5k
Merge medio
3g 18h
PR unite (30g)
188

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di react/react-native

Tutte le issue di react/react-native

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.