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 :

Executer du code C à partir d'une string.


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Executer du code C à partir d'une string.
    Salut je suis nouveau sur le forum, et je me pose la question suivante :

    j'aimerais extraire une instruction situé dans une string et l'executer dans mon programme comme une instruction normalle.

    j'ai déjà posé cette question et j'ai eu la réponse suivante :

    Je dois employer des structures contenant mes commandes en assembleur.

    La seconde question que je me pose est pourquoi je pouvais faire ca lorsque je programmais sous ma Ti89 ? ( cpu motorolla 68000 ) en C avec une commande qui devait etre un operateur. je ne suis plus très sur si c'était l'étoile ou les crochets mais je suis sur de l'avoir fait et j'avoue que ca marchais très bien.

    Malheuresement cette fonction m'est presque indispensable, et je suis un total noob en assemlbeur.

    Si ca n'est pas possible comme sur TI89 merci de m'expliquer comment c'ést possible sous TI89 et pourquoi ca n'est pas possible sur PC.

    Et des astuces pour pas trop souffrir de l'asm si ca n'est vraiment pas possible seraient le bienvenues.

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par barbare128
    Si ca n'est pas possible comme sur TI89 merci de m'expliquer comment c'ést possible sous TI89 et pourquoi ca n'est pas possible sur PC.
    Parce que sur TI89 tu n'utilisais pas le même compilateur. Avec un peu de bol, c'était même un interpréteur (ce qui expliquerait comment ça pouvait être possible).

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par barbare128
    Malheuresement cette fonction m'est presque indispensable, et je suis un total noob en assemlbeur.
    Pourquoi ? Tu veux faire quoi exactement ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    j'aimerais faire exactement la meme chose. récuperer un instruction et l'executér.

    je pourrais utuliser un switch mais cela limiterai beaucoup trop mon programme et c'est contre mon cahier des charges.

    L'assembleur, le problème c'est que ce genre de chose pourrais devenir une faille aux virus .... :/

    Il faut que je retrouve ce compilateur pour avoir plus d'infos. je comprends pas comment une instruction aussi pratique n'est pas disponnible :/ dmg

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par barbare128
    j'aimerais faire exactement la meme chose. récuperer un instruction et l'executér.
    Quelle instruction par exemple ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par Eusebius
    Parce que sur TI89 tu n'utilisais pas le même compilateur. Avec un peu de bol, c'était même un interpréteur (ce qui expliquerait comment ça pouvait être possible).
    Sur TI-89, je vois deux choses qui peuvent répondre à ce critère, mais la plus probable n'est pas directement reproductible en C:
    1. La fonction expr() de l'interpréteur BASIC, qui rappelle l'interpréteur BASIC sur la chaîne passée en paramètre. Pas d'équivalent direct en C, le plus proche serait un appel au shell UNIX par la fonction system().
    2. La commande Exec de l'interpréteur BASIC, qui convertit une chaîne de caractères hexadécimaux en du code binaire avant d'exécuter ledit code. Très facile à reproduire en C, mais spécifique au processeur, et pratiquement inutilisable sur une architecture complexe comme un ordinateur (et pas portable, bien sûr).


    Bref, le seul moyen en C est de refaire son propre interpréteur, voire un compilateur JIT (just-in-time) (ou bien, avoir le compilo déjà installé, et l'appeler en JIT).
    Par exemple, on peut générer un fichier source C, appeler le compilo dessus, puis le linker pour en faire une bibliothèque à liaison dynamique, puis la charger dynamiquement pendant l'exécution (il y a des fonctions pour cela sous Windows et sous Linux, mais ce ne sont pas les mêmes, ni le même format de bibliothèque (.dll pour windows, .so pour linux)).

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Quelle instruction par exemple ?

    le probleme c'est que c'est une table d'instruction que je charge au démarage et avec des numero. j'appele les fonctions par leur numero.

    le probleme c'est que ma table d'instruction est situé dans le début de mes fichier data. ( vu que c'est jamais le meme fichier et la meme table je suis obligé de récuperer les instructions en string. )

    midinoc > l'histoire de la librairie dynamique me plait pas mal mais cela doit demander beaucoup de prog ... ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par barbare128
    le probleme c'est que ma table d'instruction est situé dans le début de mes fichier data. ( vu que c'est jamais le meme fichier et la meme table je suis obligé de récuperer les instructions en string. )
    Je ne comprends pas...
    Tu peux préciser ?

    Et ton programme, qu'est-ce exactement ? Que fait-il, à quoi sert-il ?


    PS: Pour la bibliothèque, il faut pouvoir générer du code compilable puis exécuter le compilateur à supposer qu'il soit installé.
    Bref, c'est amusant à faire chez soi, une expérience intéressante, mais pas forcément envisageable pour un programme à distribuer...

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Je crois que personne n'a compris ce que veut barbare128.
    Sur TI 89 le langage C est interpreté et tu dois pouvoir mixer des instructions C dans ton propre programme, "exécuter" des chaines de caracteres qui contiennent des instructions C
    En langage C ce n'est pas possible c'est compilé, il faut encapsuler ton propre interpréteur ou compilateur d'expressions régulières ou non.
    Ce qui est assez ardu à faire.
    Sinon oui il y a la fonction exec().
    Regarder autour de Seer , c'est une sorte de language C "embedded"

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par barbare128
    je ne suis plus très sur si c'était l'étoile ou les crochets mais je suis sur de l'avoir fait et j'avoue que ca marchais très bien.
    C'est ce que l'on appelle des "tokens" ou caractêres nécessaires à l'nterprétation d'un code source.
    Voir avec Lexx et Yacc mais c'est pas trop destiné aux microcontroleurs

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mat.M
    Je crois que personne n'a compris ce que veut barbare128.
    Sur TI 89 le langage C est interpreté et tu dois pouvoir mixer des instructions C dans ton propre programme, "exécuter" des chaines de caracteres qui contiennent des instructions C
    En langage C ce n'est pas possible c'est compilé, il faut encapsuler ton propre interpréteur ou compilateur d'expressions régulières ou non.
    Ce qui est assez ardu à faire.
    Sinon oui il y a la fonction exec().
    Regarder autour de Seer , c'est une sorte de language C "embedded"
    pour la ti89 on travaille dans un ide sur pc, c'est un code C et compilé sur l'ordinateur, ensuite le code compilé est envoyé dans la calculette.

    donc pas de langue interpreté. c'est une instruction disponnible en asm motorolla 68000.

    faudrait juste savoir si elle existe aussi sur x86.


    donc je réplique ce que je veut faire :
    ----------------------------------------

    j'ai une fichier data.
    j'ai mon programme.

    mon programme interoge data sur son "header".
    le "header" est le début de mon fichier data contenant la liste
    des instruction que mon data va utiliser.

    mon programme charge cette liste.
    mon programme execte les instructions en fonction de la suite du
    contenu de mon data.

    ex: si mon data demande : coord.x++;
    mon programme execute directement ca.
    ni plus ni moins.

    peu importe l'instruction le programme doit pouvoir l'executer directement, la ou il faut.

    ex :


    codeinstruction = fgetinstruc(......);
    <instruction du prog>;
    <instruction>;
    ...
    <instruction>;
    execute(codeinstruction);
    <instruction>;
    <instruction>;
    ...
    <instruction>;

    ainsi de suite. je vois pas comment expliquer plus clairement.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour faire cela, quelque soit la plate-forme, il faut que ton programme soit un interpréteur ou un assembleur.
    Sache qu'il n'y a pas d'assembleur préinstallé sur une TI-89, et que la plupart des commandes du basic, bien qu'elles puissent être appelées, ne sont pas forcément sans risque.

    Sur TI-89, la commande BASIC Exec convertit du code hexa déjà assemblé en code machine. C'est très facile à faire, mais je ne sais pas si on peut l'appeler sans risque depuis un programme C/Assembleur déjà en exécution.
    C'est très facile de reproduire son comportement (une simple conversion chaîne hexa->valeurs brutes), mais sur TI-89, tu ne peux pas exécuter du code de n'importe où, et sur PC non plus.

    Sous Win32, tu peux allouer de la mémoire, convertir le contenu de la chaîne en code brut, puis te donner les droits d'exécution dessus avec VirtualProtect().
    Mais là encore, pour du code de type "coord.x++" qui est du code ni compilé ni assemblé, il faut que tu t'en occupes toi-même: Soit tu le compiles (ou le fais compiler par un compilateur installé), soit tu l'interprètes.
    Tu peux aussi faire comme le Ti-BASIC ou le Java : Tokéniser/"compiler" le code pour qu'il soit sous une forme plus rapide à interpréter (mais à interpréter quand même).

  13. #13
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Le chargement de code dynamique n'est pas non plus forcément disponible sur les architectures... Passer du cache data au cache instruction, ben c'est pas forcément gagné, surtout si ton archi ne te le permet pas.

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Médinoc
    Sous Win32, tu peux allouer de la mémoire, convertir le contenu de la chaîne en code brut, puis te donner les droits d'exécution dessus avec VirtualProtect().
    Sous linux, tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           int mprotect(const void *addr, size_t len, int prot);
    qui pourra modifier les droits de la zone allouée par mmap.

    Jc

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    sinon pour l'ide c'est TIGCC. un truc basé sur gcc pour les caltos ti.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Salut,

    Je trouve cela assez étrange de laisser un utilisateur exécuté du code directement à partir de l'exécution.

    En gros tu veux un interpréteur de la forme :

    > fonction(arguments);

    et pourquoi pas une gestion de variables, des choses comme ca ?

    en général on préfère redéfinir chacune des instructions du langages et ainsi évité que l'utilisateur puisse faire n'importe quoi.

    Sinon la gestion de bibliothèque dynamique avec dlopen peut laisser faire cela mais c'est assez dangereux.

    A la limite un interpréteur de lisp ou de caml on comprend, un interpréteur de C ... Vraiment je vois pas.

    Alexis

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    bon tempis je vais essayer de faire plus simple mais c'est vraiment domage qu'une telle fonction ne soit pas disponnible sans magouiller.


    :'(

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/01/2006, 16h26
  2. Réponses: 4
    Dernier message: 07/01/2006, 18h36
  3. Récupérer des floats à partir d'une string
    Par hamster dans le forum SL & STL
    Réponses: 8
    Dernier message: 09/06/2005, 08h10
  4. [DOM] Comment creer un DOM à partir d une String
    Par RolandB dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 24/04/2005, 18h11
  5. Récupérer le code SQL à partir d'une requête
    Par Edith_T dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 23/11/2004, 14h10

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