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
Ce code n'est PAS correct. Vous allouez 3 octets, pas 3 * sizeof (char *). Vous fuyez aussi la mémoire. – WhozCraig
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