Dans cet article je vous explique comment récupérer la valeur d’attributs protégés d’une classe dont la définition vous est inaccessible (sans utiliser de fonction comme sizeof).

Le problème

Le principe d’encapsulation suppose de ne pas exposer les membres d’une classe afin de garder un contrôle sur la manière de lire et de modifier ses attributs. En C++, les attributs d’une classe peuvent être publiques (accessibles en lecture/écriture) ou bien protégés/privés (non accessibles). Pour accéder à des attributs privés il est alors nécessaires que la classe propose des méthodes publiques.

Cependant, il arrive qu’une bibliothèque ne mette pas à disposition certaines méthodes publiques requises pour accéder à la valeur d’attributs privés. Le problème est d’autant plus vrai que le code source de cette bibliothèque n’est pas forcément accessible et donc il devient impossible de « deviner » la valeur (par exemple lorsque seules les DLLs sont à disposition).

Une solution

Supposons vouloir accéder aux membres m_val1, m_val2 and m_text de la classe Secret définie dans le fichier secret.h suivant:

Nous n’avons pas accès au code source de ce cette classe. Comme on peut le voir, il n’existe pas de méthode publique permettant de récupérer les valeurs.

La solution repose sur la définition d’une version « répliquée » de cette classe et de définir soit-même les getters :

Les valeurs sont alors accessibles en réinterprétant le pointeur sur l’instance à inspecter:

Il est évidemment non recommandé de placer ce genre de code en production car il brise le principe d’encapsulation et dépend fortement de la façon de définir la classe secrète. Cependant, cette astuce peut vous rendre service lorsqu’il s’agit de prendre en main une librairie peu documentée !

Je vous mets à disposition de quoi tester sur ce repo github : https://github.com/dash00/geekbrothers_cpp_examples/tree/master/get_private_members

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here