libjsi.so links folly and double-conversion statically, so Fantom's tester holds two copies of each (ASan: odr-violation)

Abierto
#59,671 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
cmake, cpp, react-native
Área
build-system

Línea de trabajo

Start in ReactCommon/jsi/CMakeLists.txt, where jsi is built shared and linked against static folly_runtime and double-conversion; compare that with how private/react-native-fantom/tester/third-party/folly/CMakeLists.txt links its own copies. Reproduce with the provided reproduce.sh asan-jsi-duplicates-folly or the listed gradle/yarn commands, then decide whether the tester should link a static jsi or avoid duplicate static dependencies. Done means the ASan build runs View-itest.js without the odr-violation while preserving the tester's intended sanitizer coverage.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Description

ReactCommon/jsi/CMakeLists.txt builds jsi as a shared library and links folly_runtime into it, and with folly double-conversion, both static. Fantom's tester links folly_runtime and double-conversion statically itself, and libjsi.so beside them, so its process holds two copies of each, their globals included.

Built under AddressSanitizer, with Hermes left uninstrumented, the tester stops before its first test on an odr-violation for double-conversion's PowersOfTenCache::kDecimalExponentDistance, defined once in fantom_tester and once in libjsi.so. With jsi built static in the tester there is one copy, and the tester runs its tests under AddressSanitizer.

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-duplicates-folly (needs Docker). It clones react/react-native at main, adds folly/memory/SanitizeLeak.cpp to the tester's folly (#59668), builds Hermes without the sanitizer, then 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:

./gradlew :private:react-native-fantom:prepareHermesDependencies
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

Hermes is built first so the sanitizer flags reach only the tester; with Hermes instrumented too, the first report is #59669 instead.

Expected: one copy of folly_runtime and double-conversion in the tester's process, so View-itest.js runs its tests under AddressSanitizer, as it does with jsi built static in the tester.

Seen: the tester stops before its first test on an AddressSanitizer odr-violation for double_conversion::PowersOfTenCache::kDecimalExponentDistance, defined in both fantom_tester and 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
==8078==ERROR: AddressSanitizer: odr-violation (0x59f24c526260):
  [1] size=4 'double_conversion::PowersOfTenCache::kDecimalExponentDistance' /react-native/packages/react-native/ReactAndroid/build/third-party-ndk/double-conversion/double-conversion/cached-powers.h:40 in /react-native/private/react-native-fantom/build/tester/fantom_tester
  [2] size=4 'double_conversion::PowersOfTenCache::kDecimalExponentDistance' /react-native/packages/react-native/ReactAndroid/build/third-party-ndk/double-conversion/double-conversion/cached-powers.h:40 in /react-native/private/react-native-fantom/build/tester/ReactCommon/jsi/libjsi.so
These globals were registered at these points:
  [1]:
    #0 0x59f24c93e489 in __asan_register_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:431:3
    #1 0x59f24c93f5b9 in __asan_register_elf_globals /home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_globals.cpp:414:3
    #2 0x73f2a0b5deba in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29eba) (BuildId: 6a6cb5a80fd5e5bb5bf3aeaa111add98e88843a5)

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

==8078==HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_odr_violation=0
SUMMARY: AddressSanitizer: odr-violation: global 'double_conversion::PowersOfTenCache::kDecimalExponentDistance' at /react-native/packages/react-native/ReactAndroid/build/third-party-ndk/double-conversion/double-conversion/cached-powers.h:40 in /react-native/private/react-native-fantom/build/tester/fantom_tester
MANDATORY Reproducer

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

Screenshots and Videos

No response

Lenguaje dominante
C++
Estrellas
127k
Forks
25.4k
Merge medio
3 d 8 h
PR fusionados (30 d)
118

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de react/react-native

Todos los issues de react/react-native

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.