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 :

un petit défi en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut un petit défi en C
    Bonsoir,

    Si vous avez le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>
     
    int main() {
    #include"snacker.txt"
     
        printf("%d %d %d %d\n");
     
    #include"astuce.txt"
        return 0;
    }
    dont la sortie est : 1 2 3 4 (pas plus que ça et aucune autre erreur)
    quel est le contenu de deux fichiers snacker.txt et astuce.txt ?



    Merci d'avance pour vos participations.

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Le contenu de snacker.txt serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("", 1, 2, 3, 4);
    astuce.txt est vide ou alors a un code qui n'a pas d'affichage.

  3. #3
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut
    Votre code affichera les quatre derniers nombres du stack après avoir affiché l'output demandé.
    La vraie solution montre le coté bas-niveau du langage C.

  4. #4
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Par vraie solution tu veux dire ta solution ?

    Celle que j'ai propose repond a tous les criteres. Par-contre j'attends de voir ce que quelqu'un d'autre proposera.

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Pas sûr que le côté bas-niveau du C apparaisse mais cette solution répond aux critères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat snacker.txt
    #define printf(a) fprintf(stdout,a,1,2,3,4)
    $ cat astuce.txt
    #undef printf
    @imperio Je n'ai pas la sortie attendue avec ton code, elle dépend probablement du compilateur et de l'architecture utilisés.

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    J'inclus les deux fichiers directement dans le code. Mais je ne vois pas trop ce que tu veux dire par le côté "bas niveau".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "stdio.h"
     
    int main()
    {
     
        #define printf($1) printf($1, 1, 2, 3, 4)
     
        printf("%d %d %d %d\n");
     
        #undef printf
     
        return 0;
    }
    A+

    Pfeuh

  7. #7
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut
    Par vraie solution tu veux dire ta solution ?
    Pas nécessairement, la vôtre est bien sûr correcte mais comme elle affiche ce qui est demandé en plus des quatre derniers nombres du stack, il peut y avoir une autre solution meilleure qui peut appartenir à n'importe qui.
    Voici par exemple l'output de votre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1 2 3 4
    0 134513883 -1215778828 134513872
    quant à moi je propose la solution suivante :
    le fichier snacker.txt contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    asm("pushl $4 \n\t"
        "pushl $3 \n\t " 
        "pushl $2 \n\t "
        "pushl $1 \n\t "
        "pushl $0 " );
    et le fichier astuce.txt vide.

    sachant qu'il existe encore des solutions meilleures que je pourrais ajouter ultérieurement après les contributions des membres.



    Merci.

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    snacker.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf (stdout, "1 2 3 4");
    return 0;
    Si on veut, on peut ajouter '\n' apres le 4.

    Ensuite, on met ce qu'on veut dans l'autre fichier

    Je sais, ce n'est pas ce que tu attendais snack3r, mais c'est le probleme lorsqu'on pose des problemes/questions trop ouverts.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut
    ta solution n'est pas portable car dépendant de l'architecture du processeur
    Oui je sais bien ça, j'ai oublié quand même de dire que la solution est propre à Windows parceque lorsque je l'ai testé avec Mac for Intel, j'ai obtenu des erreurs à cause de la configuration par défaut de xcode.

    Je sais, ce n'est pas ce que tu attendais snack3r, mais c'est le probleme lorsqu'on pose des problemes/questions trop ouverts.
    ta solution est aussi acceptable et correcte, le fait que j'ai laissé la question ouverte c’était pour voir le maximum possible des idées qui peuvent répondre à la question de manières différentes.

    Mon idée c’était tout simplement : passer les paramètres individuellement en utilisant le push dans le stack. bien sur on va avoir toujours besoin de modifier le code lors du passage d'un compilateur à un autre.

    La solution que je propose est la suivante :
    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
    #include <stdio.h>
     
    void GetESP (unsigned int **ptr)
    {
    	*ptr = (unsigned int *) &ptr;
    	return;
    }
     
    int main ()
    {
    	unsigned int *iPtr = NULL;
     
    	GetESP (&iPtr);
     
    	*(iPtr + 1)	= 0x1;
    	*(iPtr + 2)	= 0x2;
    	*(iPtr + 3)	= 0x3;
    	*(iPtr + 4)	= 0x4;
     
    	printf ("%08x %08x %08x %08x");
     
    	getchar ();
    	return 0;
    }

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est une proposition encore plus perverse.

    La fonction GetESP() retourne l'adresse de ptr qui est un paramètre donc une variable locale : on ne doit jamais retourner d'une façon ou d'une autre l'adresse d'une variable locale puisque celle-ci est détruite en sortie de fonction et donc son adresse devient invalide

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par diogene Voir le message
    C'est une proposition encore plus perverse.
    Et qui en plus ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > ./a.out
    65fb9798 65fb96a8 00400580 02d532d0
    Bien sur, il va sans dire que la moindre petite option de compilation, telle -Wall sur GCC, genere un warning sur ces codes, donc on sait deja que ce ne sont que des "bidouilles" pour jouer.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  12. #12
    Membre très actif
    Avatar de Snack3r
    Homme Profil pro
    Doctorant à l'Université Cheikh Anta Diop de Dakar
    Inscrit en
    Octobre 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Doctorant à l'Université Cheikh Anta Diop de Dakar
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 118
    Par défaut
    @diogene
    L'idée est de récupérer l'adresse du paramètre passé à la fonction GetESP et d'utiliser celui-ci pour affecter de nouvelles valeurs au stack, voici le code d'une autre manière :
    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
    #include <stdio.h>
     
    unsigned int *x ;
    void GetESP (unsigned int a)
    {
        //a has been pushed .. so it has the required adderss
        x=&a;
    }
     
    int main ()
    {
        GetESP(1);
        x[1] = 1;
        x[2] = 2;
        x[3] = 3;
        x[4] = 4;
        printf ("%d %d %d %d");
        getchar ();
        return 0;
    }

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

Discussions similaires

  1. Un petit défi : tester si une chaîne est un nombre romain
    Par rambc dans le forum Général Python
    Réponses: 1
    Dernier message: 09/04/2009, 12h43
  2. Petit défi SQL (Update avec condition)
    Par Angeldu74 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 03/03/2009, 12h55
  3. Petit défi en PHP
    Par davidedj dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 28/08/2006, 18h10
  4. Petit défi de lettres
    Par tiboel dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/03/2006, 00h29
  5. [W3C] Petit défi : Alignement et compatibilité IE et FF
    Par StreM dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/09/2005, 15h33

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