Pourquoi ce programme est-il segfaulting?
J'ai écrit un programme appelé Mathtext. Ce programme donne en texte brut "style" par le transfert de certaines plages de caractères en Unicode gammes telles que les mathématiques letterlike symboles" pour produire de la plaine-texte en italique, en gras, serif, etc.
Il fonctionne comme une, ligne par ligne, interprète, comme une coquille, de la sortie de la traduction de la ligne après ligne est entré. Cela signifie que les fichiers peuvent être cat
/canalisations à traduire l'intégralité d'un fichier, ainsi que le fait que vous pouvez quitter la "coque" en appuyant sur ^D, ce qui est détecté par stdin frapper les expressions du FOLKLORE.
Tout fonctionne. Cependant, lorsque j'appuie sur ^D et de sortie, il segmentation. J'ai encore du mal à saisir ce qui est à l'origine.
De la compilation avec -g -O0
aide un peu; je sais maintenant que le problème se pose à partir d'un strlen appel à transposer quand ^D est pressé. Toutefois, la transposition ne doit jamais être appelée au cours d' ^D, comme des expressions du folklore est vrai!
Program received signal SIGSEGV, Segmentation fault. __strlen_sse2 () ../sysdeps/x86_64/multiarch/../strlen.S:31 31 ../sysdeps/x86_64/multiarch/../strlen.S: Aucun fichier ou répertoire. dans ../sysdeps/x86_64/multiarch/../strlen.S (gdb) où #0 __strlen_sse2 () ../sysdeps/x86_64/multiarch/../strlen.S:31 #1 0x0000000000400b0e dans transpose (s=0x0, capsDelta=120263, smallDelta=120257, numDelta=0) à mathtext.c:58 #2 0x0000000000400e2b en main (argc=2, argv=0x7fffffffe4b8) à mathtext.c:92
OriginalL'auteur Delan Azabani | 2010-08-31
Vous devez vous connecter pour publier un commentaire.
La plupart des utilisations de
feof()
sont d'un bug et ce programme illustre parfaitement dans cette boucle principale:À la fin-de-fichier,
fgets()
sera de retourNULL
, et puis la prochaine invocation defeof()
retournera true. De sorte que la bonne approche est de tester la valeur de retour de ta fonction d'entrée - et puisque vous êtes en train de faire le test de toute façon, il n'y a pas besoin d'appelerfeof()
(sauf si vous voulez distinguer une erreur de fichier à partir de fin-de-fichier).OriginalL'auteur caf
Votre programme est référence NULL, depuis
fgets
retourne NULL en cas d'erreur ou expressions du FOLKLORE, et que vous êtes en passant directement à la transposition qui utilise le résultat naïvement.OriginalL'auteur Hasturkun
feof
ne pouvez pas prédire l'avenir. Il ne sait pas que c'est la fin de fichier jusqu'à ce que vous appuyez sur le ^D clé, en ce moment, votre programme est de retour en attente d'entrée dansfgets
. La lecture d'un fichier ne produisent pas l'erreur, car tous l'entrée est déjà présent au début. Vérifier la valeur NULL dans votre fonction de transposition.OriginalL'auteur Karl Bielefeldt