1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2016
    Messages : 36
    Points : 23
    Points
    23

    Par défaut Assigner le retour d'une fonction C sans passer par une variable temporaire

    Bonjours à tous, je suis en train de faire un projet secu pour l'école. Voici ma question.

    Est-il possible d'assigner le retour d'une fonction sans passer par une variable temporaire ?
    Quelque chose comme ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    (char)(strchr(buff, '\n')) = '\0';


    J'explique pourquoi cette question.
    Voici l'asm d'une partie du code de mon projet scolaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
       0x080484b4 <+0>:	push   ebp
       0x080484b5 <+1>:	mov    ebp,esp
       0x080484b7 <+3>:	sub    esp,0x1018
       0x080484bd <+9>:	mov    eax,DWORD PTR [ebp+0xc]
       0x080484c0 <+12>:	mov    DWORD PTR [esp],eax
       0x080484c3 <+15>:	call   0x80483b0 <puts@plt>
       0x080484c8 <+20>:	mov    DWORD PTR [esp+0x8],0x1000
       0x080484d0 <+28>:	lea    eax,[ebp-0x1008]
       0x080484d6 <+34>:	mov    DWORD PTR [esp+0x4],eax
       0x080484da <+38>:	mov    DWORD PTR [esp],0x0
       0x080484e1 <+45>:	call   0x8048380 <read@plt>
       0x080484e6 <+50>:	mov    DWORD PTR [esp+0x4],0xa
       0x080484ee <+58>:	lea    eax,[ebp-0x1008]
       0x080484f4 <+64>:	mov    DWORD PTR [esp],eax
       0x080484f7 <+67>:	call   0x80483d0 <strchr@plt>
       0x080484fc <+72>:	mov    BYTE PTR [eax],0x0
       0x080484ff <+75>:	lea    eax,[ebp-0x1008]
       0x08048505 <+81>:	mov    DWORD PTR [esp+0x8],0x14
       0x0804850d <+89>:	mov    DWORD PTR [esp+0x4],eax
       0x08048511 <+93>:	mov    eax,DWORD PTR [ebp+0x8]
       0x08048514 <+96>:	mov    DWORD PTR [esp],eax
       0x08048517 <+99>:	call   0x80483f0 <strncpy@plt>
       0x0804851c <+104>:	leave
       0x0804851d <+105>:	ret
    Dans ce bout de code, le strcpy recherche un '\n' dans une chaîne de caractères et assigne la valeur ou le pointeur pointe a '\0' sans passer par une tmp (il faut me le dire si je me trompe ).

    J'ai reproduit le même comportement, mais pas exactement le meme asm (ce n'est pas obligatoire, mais j'aimerais bien avoir le même asm ).
    Voici mon code C qui a le même comportement :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char                            *p(char *ptr, char *str)
    {
            char                    buff[0x1000];
     
            puts(str);
            read(STDIN_FILENO, buff, 0x1000);
            str = strchr(buff, '\n');
            *str = '\0';
            return (strncpy(ptr, buff, 0x14));
    }

    Mon problème est à la ligne du strchr et de la ligne suivante, j'ai trop d'ASM car je passe par une tmp contrairement au binaire de l'école.

    Avez-vous une idée de comment faire ça sans passer par une variable tmp ?

    Merci

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 922
    Points : 19 785
    Points
    19 785

    Par défaut

    Dans ton post, tu mélanges du code C avec du code assembleur.

    Ta question concerne l'assembleur ou le C ?

    Il y a 2 façons de passer des paramètres, par valeur ou par variable. En C, le passage de paramètre se fait par variable, c'est-à-dire que le contenu de la variable passée en paramètre est copié dans une variable locale à la fonction appelée. Les modifications de celle-ci ne vont pas modifier le contenu de la variable appelante.

    Tu peux contourner ce comportement via les pointeurs, mais il faut maîtriser ce que tu fais et je pense que ça n'a d’intérêt que dans des cas précis.

    Ce fonctionnement peut ne pas être apparent dans le code assembleur, selon les optimisations du compilateur.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/07/2014, 20h52
  2. Réponses: 6
    Dernier message: 20/11/2008, 15h55
  3. Background degradé sans passer par une image?
    Par j14z dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/03/2008, 15h02
  4. Réponses: 2
    Dernier message: 06/06/2006, 14h43
  5. Réponses: 14
    Dernier message: 16/05/2006, 11h26

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