Je me demande s'il est possible de déterminer si une adresse donnée est sur la pile ou dans le tas. Je voudrais cela parce qu'un système de comptage de référence que nous utilisons a une faille que si un pointeur intelligent est en quelque sorte pointé sur un objet sur la pile, de mauvaises choses peuvent arriver. Si j'avais cette fonctionnalité, je pourrais l'utiliser pour détecter cette condition d'erreur tôt et lancer de sorte que le développeur faisant ceci serait forcé de traiter ceci immédiatement.GCC prend-il en charge l'interrogation de la plage actuelle de la pile?
Répondre
Toute solution devrait être spécifique à la plate-forme. Dans Windows, vous pouvez utiliser HeapWalk pour énumérer tous les morceaux de mémoire du tas. Sous Unix, vous pouvez essayer d'utiliser pthread_attr_getstack().
Pas tout à fait correct sous Windows - HeapWalk peut parcourir les blocs pour * a * tas. Mais sur Windows, il y a généralement plus d'un tas. –
et vous pouvez énumérer des tas avec GetProcessHeaps(). – user434507
Merci! Il semble que pthread_attr_getstack() soit exactement ce que je cherchais. – dicroce
Non, c'est impossible ou pris en charge. (Eh bien, cela peut être possible si vous voulez vous fier à un comportement indéfini ou défini par l'implémentation ... I fortement vous conseille de ne pas le faire.) L'explication typique de pile et de tas enseignée dans les cours d'informatique a très peu en commun avec comment les systèmes réels (qui utilisent la mémoire virtuelle) fonctionnent.
D'une manière générale, cela ne vaut pas le coup. (Si c'était le cas, std::auto_ptr
, std::unique_ptr
, ou boost::shared_ptr
, ou boost::scoped_ptr
le feraient) Les utilisateurs C et C++ sont généralement utilisés pour travailler avec des API qui permettent un comportement indéfini si l'utilisateur fait quelque chose de stupide. Particulièrement lorsque les emplacements de stockage (pile contre magasin libre) sont concernés.
Et si c'était une fonctionnalité de construction de débogage seulement (IE il a été compilé) ... Je ne plaide pas pour cela comme une fonctionnalité, juste comme un mécanisme de sécurité lors du développement de logiciels ... Oui les programmeurs C/C++ sont utilisés dans des environnements dangereux , mais cela ne veut pas dire que nous ne devrions pas essayer de les aider! – dicroce
@dicroce: Cela n'aurait aucun sens.Lorsque vous essayez de supprimer le pointeur sur l'objet alloué, vous allez planter. Cela permettra de signaler le problème tout aussi simplement. La seule raison pour laquelle vous voudriez faire ceci serait pour la protection de l'accident d'exécution. –
oui. J'essaie de détecter cela avant ... Si la référence est squirrelée, cela pourrait être BEAUCOUP plus tard dans le programme ... et cela rendrait BEAUCOUP plus difficile ... Un contrôle de construction de débogage seulement à l'assignation à la Le temps de ref entraînerait l'erreur beaucoup plus tôt. – dicroce
La réponse directe à votre question est que GCC prend en charge le langage d'assemblage en ligne, ce qui vous permettra de comparer les pointeurs au pointeur de la pile.
Mais vous pourriez préférer forcing your objects to be heap-allocated de sorte que vous n'aurez pas ce problème en premier lieu.
Il n'est pas suffisant de connaître l'emplacement du pointeur par rapport au pointeur de la pile pour obtenir des réponses fiables à la question. Vous devez connaître la taille et la base de la pile. – user434507
+1 pour indiquer la seule réponse raisonnable à ce programme qui ne repose pas sur un comportement défini non défini ou défini par l'implémentation. –
pthread_attr_getstack() me semble assez bien défini. – dicroce
Balise C retirée; Il n'y a pas de pointeur intelligent dans C. –
Je suppose que vous voulez dire "sans tricher", sinon c'est juste une question de déclarer un local dans 'main()' et un local dans la fonction où vous voulez savoir et utiliser le adresses de ces deux comme limites. Laide, oui, mais si le compilateur applique le genre d'optimisations qui invaliderait cette approche, vous êtes sans doute sans ressources de toute façon. –
@Pascal: Eh bien, je suppose que c'est possible. Mais il faudrait aussi bien sûr s'appuyer sur un comportement indéfini. –