2010-06-07 15 views
2

[Edit1:]Une erreur de "Adresse 0x0 ne stack'd, malloc'd ou (récemment) free'd" dans le programme c sous environnement Linux

Pour le seqname, je le déclare comme mondial paramètre au début du fichier sous la forme

char seqName [20];

[Edit2:]

ne sont pas ceux nombre de passage au programme au cours de l'exécution proprement dite? J'ai reçu le message suivant en utilisant l'outil valgrind. L'entrée de commande I est:

jl @ ubuntu: ~/travail/dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test

[Edit3:]

Désolé, puisque je suis un nouvel utilisateur de Valgrind, quand je l'utilise, je ne tape que la commande dans Edit2. Cependant, ma dose de programme comporte certains paramètres de ligne de commande.

Par conséquent, je pense que je ferais mieux de déboguer mon programme par la nouvelle commande:

valgrind --tool = memcheck --leak-check = yes ./test foreman.cif 352 288


il y a un morceau de mon programme:

height = atoi(argv[3]); 

width = atoi(argv[2]); 

sprintf(seqName,"%s", argv[1]); 

// strcpy(seqName, argv[1]); 

Après verbalisateurs, un test de fichier exe est généré, puis-je utiliser Valgrind pour le vérifier. Puis j'ai reçu le message suivant, mais je n'arrive pas à comprendre ce qu'il a tendance à me dire. Quelqu'un peut-il fournir une aide aimable, Merci.

jl @ ubuntu: ~/travail/dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test

== == 28940 MemCheck, un détecteur d'erreur de mémoire

== 28940 == Copyright (C) 2002-2009, et GNU GPL'd, par Julian Seward et al.

== 28940 == Utilisation de Valgrind-3.6.0.SVN-Debian et LibVEX;

réexécutés à l'-h pour les informations de copyright

== == 28940 Commande: ./test

== == 28940

== == 28940 lecture incorrecte de la taille 1

28940 == == à 0x40260CA: strcpy (mc_replace_strmem.c: 311)

28940 == == par 0x804A5C6: main (me_search.c: 1428)

== 28940 Adresse == 0x0 est pas stack'd, malloc'd ou (récemment) free'd

== == 28940

== == 28940

28940 == == processus se terminant par action par défaut de signal 11 (SIGSEGV)

28940 == == accès à l'intérieur de la région non cartographiée à l'adresse 0x0

28940 == == à 0x40260CA: strcpy (mc_replace _strmem.c: 311)

== == 28940 par 0x804A5C6: main (me_search.c: 1428)

== == 28940 Si vous pensez qu'il est arrivé à la suite d'une pile

== == 28940 débordement dans le thread principal de votre programme (peu probable mais

== == 28940 possible), vous pouvez essayer d'augmenter la taille de la

== 28940 pile principale de fil == utilisant le - -main-stacksize = drapeau.

28940 == == La taille de la pile principale de fil utilisé dans cet essai était 8388608.

28940 == ==

28940 == == PGRPI RÉSUMÉ:

28940 == = = en cours d'utilisation, à la sortie: 0 octets 0 blocs

28940 == == d'utilisation du tas total: 0 allocs, 0 libère les, 0 octets alloués

28940 == ==

== == 28940 Tous les blocs de tas ont été libérés - pas de fuite sont possibles

== == 28940

== == 28940 Pour nombre d'erreurs détectées et réprimées, avec reprise: -v

28940 == == RÉSUMÉ dE L 'erreur: 1 erreurs de contextes (1 supprimés: 13 à partir de 8 contextes) 1 (supprimé: 13 à partir de 8)

1 contextes (supprimé: 13 de 8)

Répondre

7

Vous avez vraiment pas affiché un code assez clair pour être sûr, mais si vous appelez votre exécutable sans paramètre de ligne de commande, puis argv[1] contiendra un pointeur NULL et argv[2], argv[3] etc. contiendra des valeurs non définies.

Editer: Vous devez fournir au programme les paramètres de la ligne de commande valgrind (je suppose - je n'utilise pas valgrind moi-même). Quelque chose comme:

valgrind ... ./test foo bar zod 

Et BTW, appeler un exécutable test est une mauvaise idée sur Linux/Unix car il est très facile de se confondre avec le shell intégré du même nom

+0

merci beaucoup, Neil. J'apprends beaucoup de toi. – MaiTiano

+0

Je ne le supporterai pas. Le Général Zod doit être argumenté devant les simples paysans «foo» et «bar»! –

+0

* J'ai toujours pensé que la séquence allait "foo, bar, baz, quux" – caf

1

Vérifiez-vous le nombre réel d'arguments transmis à votre programme? (argc)

Si votre programme reçoit moins de 3 arguments et que vous essayez d'accéder à argv[1..3] - vous obtiendrez des erreurs de segmentation et d'autres comportements imprévisibles.

+1

Il n'y a pas chose en C comme une exception de pointeur NULL, ou toute sorte d'exception, viennent à cela. –

+1

+1 après la modification. – DevSolar

1

Je pense que le point est le suivant: sprintf(seqName,"%s", argv[1])

Et ce que vous voulez réellement est sprintf((strcat(seqName,"%s"), argv[1]) juger votre code.

Ce qu'il essaie de faire ici est de passer la valeur de l'expression "% s" à interpréter dans le format.Cette valeur est spécifiquement un pointeur char à un «%» dans la mémoire statique avec un «s» à côté de lui, puis un «\ 0». Éditez, oh attendez, ça ne bouge pas, je vois que c'est sprintf, pas printf. Ensuite, c'est probablement l'argument

Edit2: Aussi, seqName est-il correctement initialisé et alloué?

2

Il y a deux choses que vous devez vérifier:

1) Assurez-vous que vous êtes passé le bon nombre de paramètres en vérifiant la valeur de argc.

2) Assurez-vous que vous avez utilisé malloc() pour allouer suffisamment d'espace dans seqName avant d'essayer le strcpy().