75 votes

Comment puis-je obtenir l'adresse mémoire d'une variable JavaScript ?

Est-il possible de trouver l'adresse mémoire d'une variable JavaScript? Le code JavaScript fait partie d'une application normale où JavaScript est utilisé en tant qu'interface frontale pour le C++ et ne s'exécute pas sur le navigateur. L'implémentation JavaScript utilisée est SpiderMonkey.

0 votes

Par "intégré dans une application normale", voulez-vous dire que vous avez une page web avec du Javascript incorporé ?

0 votes

Non, cela ne fonctionne pas sur le navigateur, il n'y a pas de pages web impliquées. Le moteur JavaScript fait partie d'une application de bureau normale.

21voto

Emiel Points 460

Si cela serait possible, cela dépendrait en grande partie du moteur JavaScript. Les moteurs JavaScript modernes compilent leur code en utilisant un compilateur à la volée et altérer leurs variables internes serait soit préjudiciable aux performances, soit préjudiciable à la stabilité.

Si le moteur le permet, pourquoi ne pas créer une interface d'appel de fonction vers un code natif pour échanger les valeurs des variables?

1 votes

Oui, je suis d'accord, je pense avoir besoin d'un code en C++ qui peut interagir avec JavaScript.

13voto

Piotr Dobrogost Points 14412

Très bonne question sans réponse satisfaisante jusqu'à présent ... Je suis déçu.

L'adresse d'une variable peut être traitée comme son identifiant unique. Pouvoir voir une telle adresse aiderait à résoudre les problèmes d'identité lors du débogage. C'est quand vous avez deux variables ou plus et vous vous attendez à ce qu'elles pointent toutes vers le même objet mais la comparaison de deux d'entre elles avec l'opérateur === renvoie false. S'il était possible d'obtenir l'adresse d'une variable, vous pourriez suivre quand et où elle a été créée et découvrir ce qui se passe.

13voto

user2310967 Points 89

Il est plus ou moins impossible - la stratégie d'évaluation de Javascript est d'utiliser toujours l'appel par valeur, mais dans le cas des Objets (y compris les tableaux) la valeur passée est une référence à l'Objet, qui n'est pas copiée ou clonée. Si vous réaffectez l'Objet lui-même dans la fonction, l'original ne sera pas modifié, mais si vous réaffectez l'une des propriétés de l'Objet, cela affectera l'Objet d'origine.

Cela dit, que cherchez-vous à accomplir? S'il s'agit simplement de passer des données complexes entre C++ et Javascript, vous pouvez utiliser une bibliothèque JSON pour communiquer. Envoyez un objet JSON à C++ pour le traitement, et recevez un objet JSON pour remplacer l'ancien.

0 votes

Note intéressante sur la réaffectation de l'objet lui-même ou d'une propriété. Pouvez-vous d'une manière ou d'une autre changer l'objet auquel l'original pointe?

1 votes

Voulez-vous dire changer la référence d'un objet dans un autre contexte? Non. Dans de telles situations, il est préférable d'utiliser l'encapsulation de JS ou les fonctionnalités orientées objet, soit en mettant le corps de la fonction et la référence que vous voulez changer dans le même contexte, soit en faisant de la référence et des membres de la fonction des membres du même objet.

3voto

jeffbRTC Points 1763

Vous pouvez utiliser un canal secondaire, mais vous ne pouvez rien en faire de utile autre que d'attaquer la sécurité du navigateur!

Le plus proche des adresses virtuelles sont les ArrayBuffers.

Si une adresse virtuelle dans un ArrayBuffer est identifiée, les adresses restantes sont également connues, car les adresses de la mémoire et les indices du tableau sont linéaires.

Bien que les adresses virtuelles ne soient pas elles-mêmes des adresses physiques de mémoire, il existe des moyens de traduire une adresse virtuelle en une adresse physique de mémoire.

Les moteurs de navigateur allouent toujours les ArrayBuffers de manière alignée sur les pages. Le premier octet de l'ArrayBuffer se trouve donc au début d'une nouvelle page physique et a les 12 bits de poids faible les plus significatifs mis à '0'.

Si un grand morceau de mémoire est alloué, les moteurs de navigateur utilisent généralement mmap pour allouer cette mémoire, ce qui est optimisé pour allouer des pages énormes transparentes (THP) de 2 MB au lieu de pages de 4 KB.

Comme ces pages physiques sont mappées sur demande, c'est-à-dire dès que le premier accès à la page se produit, parcourir les indices du tableau entraîne des interruptions de page au début d'une nouvelle page. Le temps pour résoudre une interruption de page est significativement plus long qu'un accès mémoire normal. Ainsi, vous pouvez savoir à quel index du tableau une nouvelle page de 2 MB commence. À cet index du tableau, la page physique sous-jacente a les 21 bits de poids faible les plus significatifs mis à '0'.

Cette réponse n'essaye pas de fournir une preuve de concept car je n'ai pas le temps pour cela, mais je pourrais le faire dans le futur. Cette réponse est une tentative de pointer dans la bonne direction la personne posant la question.

Sources,

http://www.misc0110.net/files/jszero.pdf

https://download.vusec.net/papers/anc_ndss17.pdf

0voto

wilhelmpaulm Points 31

Je pense que c'est possible, mais vous devriez :

  1. télécharger le code source de node.js.
  2. ajouter manuellement votre fonction (comme retourner l'adresse mémoire d'un pointeur, etc.)
  3. compiler et l'utiliser comme exécutable node.

2 votes

Est-ce votre hypothèse ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X