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 :

provoquer depassement de capacite tableau en C


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut provoquer depassement de capacite tableau en C
    Bonjour a tous,
    je voudrai ecrire un programme qui declare un tableau et qui fait un depassement de capacite, jai fait ceci, mais bizzarement ça marche sans erreur!!!!

    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
    #include <stdio.h>
    #include <stdlib.h>
    int tabe[1];
    int i;
     
    int main()
    {
        printf("hhh%d",tabe[2]);
        for( i=0;i<=12;i++){
        printf("donner");
        scanf("%d",&tabe[i]);
        printf("valeut%d = %d\n",i,tabe[i]);
        }
     
        return 0;
    }
    que faire?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Quel est le but de l'affaire ?

    Si tu débordes du tableau, il faut s'attendre à n'importe quel résultat. Ca dépend où tu "tapes". Ce n'est pas magique non plus.

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Citation Envoyé par naetoila Voir le message
    Bonjour a tous,
    je voudrai ecrire un programme qui declare un tableau et qui fait un depassement de capacite, jai fait ceci, mais bizzarement ça marche sans erreur!!!!
    Y'a pas erreur : ca ne plante pas, oui. Mais de là à dire que ca marche !!
    Tu gardines en mémoire donc, ca peut marcher comme ca ne peut pas marcher.

    A mon avis si tu déclares plusieurs tableaux, avec un peu de chance, si tu débordes du 1er, ca ira écrire dans le 2e.

  4. #4
    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
    Bonjour,

    Tu fais tout a fait un depassement de capacite : tu accedes a plusieurs cellules memoires qui sont en dehors de ton tableau.

    Reste maintenant a savoir ce que tu voulais faire, et pourquoi tu n'es pas content du resultat.

    PS : je pense que le resultat que tu souhaites est un crash. Mais ce n'est pas aussi simple que ca : la, tu accedes a une zone memoire dont tu ne connais rien : tu ne sais pas a qui elle est allouee (probablement a ton programme, mais pas forcement), ni donc si tu as des droits dessus ou non.

    PPS : essaie en manipulant des zones memoires dynamiques, a base de malloc/free. Je sais que ce ne sont pas des tableaux, mais le comportement a plus de chances d'etre celui que tu attends.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut but pedagogique
    Merci pour vos reponses!
    je voulais montrer qu'on ne pouvait pas faire un depassement de capacité, (c'est ce qu'on m'a enseigner!!) et d'habitude en Java (car je programme en java depuis 7ans) et bien ça fait de droles erreurs qu'on fait des depassement de capacite. et a ma surprise en C ça marche plus ou moins car meme en y accedant par des printf apres il les retrouve!!!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par naetoila Voir le message
    Merci pour vos reponses!
    je voulais montrer qu'on ne pouvait pas faire un depassement de capacité, (c'est ce qu'on m'a enseigner!!) et d'habitude en Java (car je programme en java depuis 7ans) et bien ça fait de droles erreurs qu'on fait des depassement de capacite. et a ma surprise en C ça marche plus ou moins car meme en y accedant par des printf apres il les retrouve!!!
    Dans ton programme, ton tableau est une variable globale et non local. Les zones mémoire utilisées ne sont pas les mêmes.

    Le langage C est un langage de programmation de bas niveau et il n'existe pas de mécanisme de vérification de dépassement. En C, c'est au programmeur de vérifier tout ce qu'il fait, et de s'assurer qu'il écrit/lit des valeurs situées dans les adresses autorisées.
    Ecrire une valeur en dehors d'un tableau provoque un comportement indéterminé, car cela dépend justement ce qui se trouve à cet endroit là.

    Le Java, lui, est un langage de haut niveau, avec des mécanismes de vérification intégrés.

    Si tu tiens vraiment à faire crasher ton programme C, essaye de compiler ce code, en supprimant les optimisations :
    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
    #include <stdio.h>
     
    void crash(void)
    {
    	char chaine[1];
    	int c = 0; /* augmenter "c" s'il le faut, jusqu'à obtenir le résultat souhaité */
     
    	for ( ;
    	c < 20 ; /* valeur arbitaire, à modifier si nécessaire */
    	c++)
    	{
    		chaine[c] = 0;
    		printf("%d\n" , c);
    	}
    }
     
    int main(void)
    {
    	crash();
    	return 0;
    }
    Selon la manière dont le compilateur compile, il se peut que la variable "c" soit indirectement modifiée à cause du débordement du tableau (i.e. la variable "c" peut se situer avant ou après le tableau), ce qui peut provoquer une boucle infinie. Il faut donc initialiser "c", en trouvant manuellement la "bonne" valeur, si tu veux obtenir le crash souhaité.

    Explication du crash :
    Le programme utilise une pile d'exécution (une zone mémoire) pour fonctionner. Les variables locales de la fonction courante sont empilées dans cette zone mémoire, puis dépilées à sa sortie. Les fonctions utilisent également cette pile, afin d'y stoker la valeur du registre EBP, ainsi que l'adresse à laquelle revenir pour quitter la fonction courante (instruction RET).
    Le programme au-dessus écrase la valeur qui sera récupérée par le POP EBP à la sortie du programme, ainsi que l'adresse retour utilisée par RET.
    Bon, après, je ne sais pas si tu as des notions d'assembleur pour bien comprendre le principe ?

  7. #7
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut SI SI
    Je voie tres bien ce que tu veux dire. j'ai completement oublie cette histoire de langage bas niveau. je me suis habitué au confort java.
    c'est vrais qu'on C on a tendance a faire n'importe quoi ça se compile et ça marche!! c'est vrai que ce n'est pas le resultat recherché mais ça ne plante pas.

    et merci de m'avoir rappele cette histoire de pile d'execution

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Sous GNU/Linux, si vous voulez vraiment voir que vous avez fait, utilisez valgrind, qui reportera une jolie erreur en analysant votre programme .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. [VBA-E]Depassement de capacité
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 16/05/2006, 15h13
  2. probleme de depassement de capacité
    Par el_quincho dans le forum Access
    Réponses: 3
    Dernier message: 19/04/2006, 13h38
  3. probleme de depassement de capacités
    Par el_quincho dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 10h02
  4. [VB6] Hex(Double) - depassement de capacite
    Par SErhio dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/05/2005, 17h09
  5. depassement de capacité
    Par jpg dans le forum ASP
    Réponses: 2
    Dernier message: 19/08/2004, 18h26

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