From c2ac0cc72ac360367bc2343e73f96c39a196e9d2 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Thu, 9 Nov 2023 22:14:57 -0800 Subject: [PATCH] react-native-codegen: Cxx TMs > Fixed Undefined Behavior exception when running ASAN builds (#41401) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41401 Changelog: [Internal] When build Cxx Turbo Modules with Clang's ASAN build mode the apps are crashing at runtime due to, e.g.: ``` runtime error: downcast of address 0x00010dafd618 which does not point to an object of type 'facebook::react::NativePerformance' 0x00010dafd618: note: object is of type 'facebook::react::NativePerformanceCxxSpec' 00 00 00 00 f0 08 49 06 01 00 00 00 4e 61 74 69 76 65 50 65 72 66 6f 72 6d 61 6e 63 65 43 78 78 ^~~~~~~~~~~~~~~~~~~~~~~ vptr for 'facebook::react::NativePerformanceCxxSpec' UndefinedBehaviorSanitizer: undefined-behavior FBReactNativeSpecJSI.h:6122:17 ``` Where the corresponding generated code looks like ``` NativePerformanceCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePerformanceCxxSpec::kModuleName}, jsInvoker), delegate_(static_cast(this), jsInvoker) {} ``` This change fixes that problem AddressSanitizer: stack-use-after-scope shared_ptr.h:634 in std::__1::shared_ptr::shared_ptr[abi:v160006](std::__1::shared_ptr const&) Shadow bytes around the buggy address: 0x00016cea4a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x00016cea4b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x00016cea4b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x00016cea4c00: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 f8 f8 f8 f8 0x00016cea4c80: f8 f8 f2 f2 f2 f2 f8 f8 f2 f2 00 00 f2 f2 f8 f8 =>0x00016cea4d00: f2 f2 f8 f8 f2 f2 00 00 f2 f2[f8]f8 f2 f2 00 00 0x00016cea4d80: f2 f2 f8 f8 f2 f2 f8 f8 f2 f2 f8 f8 f8 f2 f2 f2 0x00016cea4e00: f2 f2 f8 f8 f2 f2 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 0x00016cea4e80: f8 f8 f8 f8 f8 f8 f8 f8 f8 f2 f2 f2 f2 f2 f2 f2 0x00016cea4f00: f2 f2 f8 f8 f3 f3 f3 f3 00 00 00 00 00 00 00 00 0x00016cea4f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb ==41992==ABORTING ``` Reviewed By: rshest Differential Revision: D51183328 fbshipit-source-id: 5aff5b5eecb9d78f9b7438fbdda2c01625c9a4d9 --- .../GenerateModuleH-test.js.snap | 64 +++++++++---------- .../src/generators/modules/GenerateModuleH.js | 2 +- .../GenerateModuleH-test.js.snap | 20 +++--- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap index fb9a915712a..344b22b8866 100644 --- a/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap @@ -42,7 +42,7 @@ public: protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeArrayTurboModuleCxxSpecJSI { @@ -105,7 +105,7 @@ public: protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeBooleanTurboModuleCxxSpecJSI { @@ -160,7 +160,7 @@ public: protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCallbackTurboModuleCxxSpecJSI { @@ -451,7 +451,7 @@ public: protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeEnumTurboModuleCxxSpecJSI { @@ -542,7 +542,7 @@ public: protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNullableTurboModuleCxxSpecJSI { @@ -629,7 +629,7 @@ public: protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNumberTurboModuleCxxSpecJSI { @@ -687,7 +687,7 @@ public: protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeObjectTurboModuleCxxSpecJSI { @@ -765,7 +765,7 @@ public: protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeOptionalObjectTurboModuleCxxSpecJSI { @@ -861,7 +861,7 @@ public: protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePartialAnnotationTurboModuleCxxSpecJSI { @@ -932,7 +932,7 @@ public: protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePromiseTurboModuleCxxSpecJSI { @@ -1036,7 +1036,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1228,7 +1228,7 @@ public: protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleArraysCxxSpecJSI { @@ -1420,7 +1420,7 @@ public: protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableCxxSpecJSI { @@ -1614,7 +1614,7 @@ public: protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI { @@ -1808,7 +1808,7 @@ public: protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleOptionalCxxSpecJSI { @@ -1951,7 +1951,7 @@ public: protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeStringTurboModuleCxxSpecJSI { @@ -2030,7 +2030,7 @@ public: protected: NativeArrayTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeArrayTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeArrayTurboModuleCxxSpecJSI { @@ -2093,7 +2093,7 @@ public: protected: NativeBooleanTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeBooleanTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeBooleanTurboModuleCxxSpecJSI { @@ -2148,7 +2148,7 @@ public: protected: NativeCallbackTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCallbackTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCallbackTurboModuleCxxSpecJSI { @@ -2439,7 +2439,7 @@ public: protected: NativeEnumTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeEnumTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeEnumTurboModuleCxxSpecJSI { @@ -2530,7 +2530,7 @@ public: protected: NativeNullableTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNullableTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNullableTurboModuleCxxSpecJSI { @@ -2617,7 +2617,7 @@ public: protected: NativeNumberTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeNumberTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeNumberTurboModuleCxxSpecJSI { @@ -2675,7 +2675,7 @@ public: protected: NativeObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeObjectTurboModuleCxxSpecJSI { @@ -2753,7 +2753,7 @@ public: protected: NativeOptionalObjectTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeOptionalObjectTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeOptionalObjectTurboModuleCxxSpecJSI { @@ -2849,7 +2849,7 @@ public: protected: NativePartialAnnotationTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePartialAnnotationTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePartialAnnotationTurboModuleCxxSpecJSI { @@ -2920,7 +2920,7 @@ public: protected: NativePromiseTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativePromiseTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativePromiseTurboModuleCxxSpecJSI { @@ -3024,7 +3024,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -3216,7 +3216,7 @@ public: protected: NativeSampleTurboModuleArraysCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleArraysCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleArraysCxxSpecJSI { @@ -3408,7 +3408,7 @@ public: protected: NativeSampleTurboModuleNullableCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableCxxSpecJSI { @@ -3602,7 +3602,7 @@ public: protected: NativeSampleTurboModuleNullableAndOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleNullableAndOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleNullableAndOptionalCxxSpecJSI { @@ -3796,7 +3796,7 @@ public: protected: NativeSampleTurboModuleOptionalCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleOptionalCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleOptionalCxxSpecJSI { @@ -3939,7 +3939,7 @@ public: protected: NativeStringTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeStringTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeStringTurboModuleCxxSpecJSI { diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index fe6e05786cb..6dd3289216a 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -80,7 +80,7 @@ public: protected: ${hasteModuleName}CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public ${hasteModuleName}CxxSpecJSI { diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap index 20fb6911293..75e2dd9187d 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap @@ -41,7 +41,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -111,7 +111,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -359,7 +359,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -462,7 +462,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -599,7 +599,7 @@ public: protected: AliasTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{AliasTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public AliasTurboModuleCxxSpecJSI { @@ -934,7 +934,7 @@ public: protected: NativeCameraRollManagerCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeCameraRollManagerCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeCameraRollManagerCxxSpecJSI { @@ -1170,7 +1170,7 @@ public: protected: NativeExceptionsManagerCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeExceptionsManagerCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeExceptionsManagerCxxSpecJSI { @@ -1373,7 +1373,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1548,7 +1548,7 @@ public: protected: NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModuleCxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModuleCxxSpecJSI { @@ -1595,7 +1595,7 @@ public: protected: NativeSampleTurboModule2CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeSampleTurboModule2CxxSpec::kModuleName}, jsInvoker), - delegate_(static_cast(this), jsInvoker) {} + delegate_(reinterpret_cast(this), jsInvoker) {} private: class Delegate : public NativeSampleTurboModule2CxxSpecJSI {