IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Changement des constantes post-compilation


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Changement des constantes post-compilation
    Bonjour

    Imaginons un programme simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "const.h"
    int main()
    {
        std::cout << UNE_CONST << std::endl;
        return 1;
    }
     
     
    /// const.h
    #define UNE_CONST 33
    Une fois compilé, je vais obtenir un executable (prog.exe), en lisant une version binaire (ex: avec notepad) ou hexadecimale (hexdump) de cet executable, on devrait pouboir localiser la constante de valeur 33, non ?
    Ma question est, j'aimerais pouvoir avec une fonction, qui va lire le code de son propre executable, et changer la valeur, pour que au prochain lancement de l'application, la nouvelle valeur soit là !
    De plus, j'aimerais si possible, que cette valeur soit appliquée à l'application en cours (en gros, modification d'une constante ! (attention ca va crier là ! )

    Merci d'avance
    nico

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Hello,

    même si c'était réellement une bonne idée de le faire tu ne pourrais pas. Au moment du preprocessing chaque occurence de UNE_CONST est remplacée par la valeur 33. Donc :
    • la valeur 33 n'est pas localisée à un endroit
    • tous les 33 ne viennent pas du remplacement de UNE_CONST
    • des optimisations peuvent faire disparaître la valeur 33 -> UNE_CONST * 2 sera remplacée directement par 66
    • ...


    Tu vois, même si c'était une super bonne idée, elle ne fonctionnerait pas, tu ne peux même plus le faire au moment de la compilation ...
    Oublions cette idée qui est le mal

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    plus qu'une constante, ce que tu utilises c'est un define, soit une constante de compilation.
    Ce qui signifie que sa valeur est fixée à la compilation, rendant tout bonnement impossible sa modification par la suite. En fait les constantes de compilation sont tout simplement inexistantes dans le programme finale, chaque occurence de leur nom est juste remplacée par la valeur correspondante.


    Il faut déjà définir de manière claire ton problème.
    D'office, si tu veux une valeur évolutive, pourquoi parler de constante ?!
    Si en plus elle doit changer d'une exécution à l'autre, y'a un aspect persistance/sauvegarde/mise à jour nécessaire.
    Et un moyen simple pour ça c'est un fichier dans lequel on stocke la valeur que l'on souhaite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Déjà, ton symbole défini sera remplacé par sa valeur, ou par le résultat des opérations mathématiques qui seront basées dessus

    De plus, dans un exécutable, cette valeur apparaitra d'office au format binaire, donc de préférence au format hexadécimal lorsque tu la rechercheras

    Seulement, il y a une foule de raisons pour lesquelles cette valeur pourrait parfaitement apparaître sans qu'elle n'ait ton symbole comme origine (ne serait ce que parce que cela pourrait correspondre à la somme des tailles de certains arguments.

    Enfin, les anti-virus ont tendance à ne pas être tendre avec les exécutables qui se modifient eux meme, les assimilant à des virus. Si ton exécutable se modifie lui-même, il a de fortes chances de se retrouver au minimum en quarantaine avant que tu n'aies le temps de dire "ouf".

    Sans oublier le fait que, si tu as défini une constante de compilation à 33, c'est sans doute parce que tu avais une bonne raison de le faire, et qu'il ne te fallait ni 32, ni 34.

    Si même tu arrivais à retrouver tous les endroits où ta constante de compilation a bel et bien été utilisée, en en modifiant la valeur directement dans l'exécutable, tu modifierais sans doute intégralement le comportement de ce dernier, et ce n'est surement pas ce que tu veux faire

    Moralité : laisses bien ta constante là où elle est et n'essayes pas de la modifier après la compilation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par DakM Voir le message
    Ma question est, j'aimerais pouvoir avec une fonction, qui va lire le code de son propre executable, et changer la valeur, pour que au prochain lancement de l'application, la nouvelle valeur soit là !
    Pour ce genre de traitement on a inventé les fichiers de configuration.

    Citation Envoyé par DakM Voir le message
    De plus, j'aimerais si possible, que cette valeur soit appliquée à l'application en cours (en gros, modification d'une constante ! (attention ca va crier là ! )
    Un fichier exe en cours d'exécution n'est pas modifiable. Il est locké par l'OS.
    Dans ce genre de traitement, on modifie le fichier de configuration, et on fait une entrée utilisateur sur l'application qui recharge le fichier de configuration. C'est un exemple.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Un fichier exe en cours d'exécution n'est pas modifiable. Il est locké par l'OS.
    Ca dépend de l'OS. Sur linux, tu peux modifier un exe alors qu'il s'exécute, mais la modification ne sera prise en compte que s'il est relancé.

Discussions similaires

  1. Réponses: 22
    Dernier message: 17/11/2007, 14h59
  2. Réponses: 15
    Dernier message: 30/08/2007, 17h08
  3. Réponses: 3
    Dernier message: 14/04/2006, 10h43
  4. Gestion des constantes
    Par valfredr dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/06/2003, 16h23
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo