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

Offen Anfängerfreundlich
#59,944 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 2 Tagen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
82/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
cpp, react-native
Bereich
mobile

Rechercherichtung

Lies packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h, insbesondere die Zeilen 144–148, und untersuche den Rückgabetyp und die Implementierung von getConcreteSharedProps(). Kompiliere den bereitgestellten Reproducer mit -Wreturn-stack-address, um die Warnung zu bestätigen, und passe dann die Methode so an, dass ihr Rückgabewert gültig bleibt, wobei der angeforderte Name und die Constness erhalten bleiben. Erledigt, wenn der Reproducer ohne die Warnung kompiliert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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://github.com/YevheniiKotyrlo/concrete-shadow-node-dangling-shared-props

Vorherrschende Sprache
C++
Sterne
127k
Forks
25.5k
Ø Merge
3 T. 18 Std.
Gemergte PRs (30 T.)
188

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus react/react-native

Alle Issues in react/react-native

Ähnliche Issues

Weitere Issues zu C++

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.