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 :

Pourquoi n'y a t-il pas d'erreur de segmentation ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Par défaut Pourquoi n'y a t-il pas d'erreur de segmentation ?
    Bonjour, lorsque j'execute ce programme il n'y a pas d'erreur de segmentation alors que normalement j'accède à une zone mémoire non autorisée.
    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
    25
    26
    27
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    	int i=0;
    	int * a = NULL;
    	int taille_tab = 0;
     
    	printf("Entrer la taille du tableau\n");
    	scanf("%d",&taille_tab);
     
    	a = (int*)malloc(taille_tab*sizeof(int));
     
    	for(i=0;i<taille_tab+1;i++)
    	{
    		printf("Entrer la valeur de la case %d\n",i+1);
    		scanf("%d",&a[i]);
    	}
     
    	for(i=0;i<taille_tab+1;i++)
    	{
    		printf("a[%d] = %d\n",i,a[i]);
    	}
     
    	return 0;
    }
    Le dernier tour de boucle donne une case hors du tableau puique j'ajoute 1 à la valeur allouée par malloc.

    Merci de votre réponse.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Je n'ai pas vérifié ni testé ton code, mais j'ai bien une explication à te proposer. Il faut savoir qu'écrire en dehors de la zone allouée par malloc() ou des bornes d'un tableau (déclaré avec int a[42];) ou même accéder à une adresse plus ou moins aléatoire ne génère pas forcément d'erreur de segmentation. Une telle erreur est générée si tu écris (ou si tu lis) à une adresse que ton système d'exploitation ne considère pas comme étant une adresse valide pour ton programme. Si l'adresse est acceptée, tu vas pouvoir lire et écrire à l'intérieur de ton programme et écraser tes propres données.

    Regarde cet article, je montre que je peux écraser mes propres données avec gets() https://gradot.wordpress.com/2013/05...-programmes-c/

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Par défaut
    Merci pour cette réponse rapide. C'est bon j'ai compris ta réponse, en plus l'article explique bien aussi

  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
    Il faut savoir que malloc alloue la mémoire par page qui font généralement 4096 octets (c'est le chiffre le plus courant que j'ai croisé). Donc si tu fais un malloc de 1, tu pourras lire 4096 octets même si "officiellement" tu n'as le droit qu'à un seul octet.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Il faut savoir aussi qu'exécuter un truc de ce genre produit un "comportement indéterminé" c'est à dire "imprévisible" (dans la plus pure définition de ce mot) donc que tu ne peux pas prédire.
    Tu ne peux donc pas savoir ce qui va se passer. Ca peut crasher un segfault tout comme ça peut fonctionner. Et si ça fonctionne, ça peut fonctionner les lundis, mardis et planter les mercredis. Ca peut fonctionner 6 mois jusqu'au jour où tu rajoutes un truc anodin comme un printf() et là tu galères à te demander pourquoi printf() fait planter ton truc.
    Bref c'est la pire des situations possibles pour un programme...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 319
    Par défaut
    Il faut savoir que malloc alloue la mémoire par page qui font généralement 4096 octets
    Non, malloc alloue ce que tu as demandé sur le tas (heap), le tas est lui effectivement un multiple de 4096 K, Si malloc atteint la limite du tas, celui-ci va être agrandi avec brk(). Ajout de page(s) dans l'espace d'adressage de l'appli par la MMU.

    Dans le cas de ton dépassement de boucle, il t'affichera comme un int le contenu de la case mémoire suivant ton tableau allouée à autre chose. Le segfault ne se produit que si tu essayes de lire une adresse mémoire n'appartenant pas à l'espace d'adressage de ton appli, ou si tu essayes d"écrire dans le segment de code de ton appli par exemple.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    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
    @chrtophe: Mon explication était volontairement non-explicite. Cela dit, je pense que j'aurais dû le préciser donc merci à toi de l'avoir fait.

Discussions similaires

  1. [Outils][Crystal Report] Pourquoi mes icones ne s'affichent pas ?
    Par tonynho dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 12/05/2006, 15h29
  2. [ADO.Net][OleDb] Pourquoi ma requête access ne fonctionne pas?
    Par Bapt.ice dans le forum Accès aux données
    Réponses: 6
    Dernier message: 05/05/2006, 17h19
  3. Pourquoi n'y à t'il pas de rubrique Windev sur www.developpez.com ?
    Par TicTacToe dans le forum Evolutions du club
    Réponses: 12
    Dernier message: 21/04/2006, 17h44
  4. Pourquoi rand()%N n'est il pas équiprobable?
    Par Pragmateek dans le forum C++
    Réponses: 12
    Dernier message: 22/03/2006, 23h37

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