2012-12-06 2 views
-1

Je viens de mettre en œuvre un logiciel assez compliqué, mais le système de test de mon école ne le prendra pas. Le système utilise la bibliothèque appelée mudflap qui devrait permettre d'éviter les accès illégaux à la mémoire. Par conséquent, mon programme génère des erreurs de segmentation lorsqu'il est exécuté sur le système de test de l'école (je soumets le code source et le système de test le compile lui-même, en utilisant la bibliothèque mudflap).Mudflap et tableaux de pointeurs

J'ai essayé d'isoler le code problématique dans mon programme, et il semble que tout se résume à quelque chose d'aussi simple que les tableaux de pointeurs. Mudflap ne semble pas les aimer.

est Ci-dessous un morceau de code très simple, certains avec qui fonctionne avec un tableau de pointeurs:

#include <stdlib.h> 
int main() 
{ 
char** rows; 
rows=(char**)malloc(sizeof(char*)*3); 
rows[0]=(char*)malloc(sizeof(char)*4); 
rows[1]=(char*)malloc(sizeof(char)*4); 
rows[2]=(char*)malloc(sizeof(char)*4); 
strcpy(rows[0], "abc"); 
strcpy(rows[1], "abc"); 
strcpy(rows[2], "abc"); 
free(rows[0]); free(rows[1]); free(rows[2]); 
free(rows); 
return 0; 

Cela va générer une erreur de segmentation avec bavette. À mon avis, c'est un code parfaitement légal. Pourriez-vous s'il vous plaît m'expliquer ce qui ne va pas, et pourquoi il génère une erreur de segmentation avec bavette?

Note: Le programme doit être compilé sous un système Linux amd64 avec g ++ en utilisant les commandes suivantes:

export MUDFLAP_OPTIONS='-viol-segv -print-leaks'; 
    g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp 
+1

Ce code n'est PAS correct. Vous allouez 3 octets, pas 3 * sizeof (char *). Vous fuyez aussi la mémoire. – WhozCraig

+0

J'ai corrigé le code. C'était vraiment juste une faute de frappe. Le point est - cette version ne fonctionne pas non plus. (Maintenant, je libère même la mémoire allouée, même si cela ne sert à rien de le faire ici.) – PSkocik

Répondre

3

Vous avez au moins un problème ici:

char** rows; 
rows=(char**)malloc(3); 

Ceci allouera 3 octets. Sur la plupart des plates-formes, l'allocateur dispose probablement d'au moins 4 octets, ce qui vous permet d'écraser un peu le tampon. Je suppose que votre bibliothèque de mudflap est plus stricte dans sa vérification et attrape l'écrasement. Toutefois, si vous voulez un tableau de 3 char * pointeurs, vous avez probablement besoin d'au moins 12 octets.

Essayez de changer ces lignes:

char** rows; 
rows=(char**)malloc(3 * sizeof(char *)); 

EDIT: En fonction de votre code modifié, je suis d'accord, il semble maintenant correct. La seule chose que je peux suggérer est que peut-être malloc() échoue et provoque un accès pointeur NULL. Si ce n'est pas le cas, cela ressemble à un bug ou une mauvaise configuration de bavette.

+0

Mes excuses. Oui vous avez raison. Le premier paramètre à malloc aurait dû être sizeof (char *). Le problème est. Ça ne marche pas non plus. :/ – PSkocik

+0

Il n'y a qu'un seul paramètre à malloc(). Voulez-vous dire '3 * sizeof (char *)'? –

+0

J'ai corrigé le code dans ma question. Le fait est que la bavette ne l'aime toujours pas: /. – PSkocik