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

Ouverte Adaptée aux débutants
#59,944 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
82/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
cpp, react-native
Domaine
mobile

Piste de recherche

Lisez packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h, en particulier les lignes 144–148, et examinez le type de retour ainsi que l’implémentation de getConcreteSharedProps(). Compilez le reproducteur fourni avec -Wreturn-stack-address pour confirmer l’avertissement, puis mettez à jour la méthode afin que sa valeur de retour reste valide tout en préservant le nom et la constance demandés. Le travail est terminé lorsque le reproducteur compile sans l’avertissement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

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
  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

Langage dominant
C++
Étoiles
127k
Forks
25.5k
Merge moyen
3 j 18 h
PR mergées (30 j)
188

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de react/react-native

Toutes les issues de react/react-native

Issues similaires

Plus d'issues C++

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.