我已经编写了一个程序,名为Mathtext。该程序通过将某些字符范围转换为Unicode范围(例如“数学字母符号”)来产生纯文本斜体、粗体、衬线等样式的纯文本。
它作为逐行解释器工作,类似于shell,在输入一行后输出翻译后的行。这意味着可以通过
一切都很正常。然而,当我按下^D并退出时,它会发生段错误。我仍然无法完全理解是什么原因导致了这个问题。
使用
程序收到 SIGSEGV 信号,出现段错误。 __strlen_sse2 () 位于 ../sysdeps/x86_64/multiarch/../strlen.S 的第 31 行。 ../sysdeps/x86_64/multiarch/../strlen.S:没有那个文件或目录。 在 ../sysdeps/x86_64/multiarch/../strlen.S 中。 (gdb) where #0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:31 #1 0x0000000000400b0e in transpose (s=0x0, capsDelta=120263, smallDelta=120257, numDelta=0) at mathtext.c:58 #2 0x0000000000400e2b in main (argc=2, argv=0x7fffffffe4b8) at mathtext.c:92
它作为逐行解释器工作,类似于shell,在输入一行后输出翻译后的行。这意味着可以通过
cat
/piped来翻译整个文件,同时您也可以通过按下^D来“退出”“shell”,stdin检测到EOF时会退出。一切都很正常。然而,当我按下^D并退出时,它会发生段错误。我仍然无法完全理解是什么原因导致了这个问题。
使用
-g -O0
编译有所帮助;现在我知道问题出现在transpose中的strlen调用中,当按下^D时会出现。然而,在^D期间永远不应该调用transpose,因为eof为真!程序收到 SIGSEGV 信号,出现段错误。 __strlen_sse2 () 位于 ../sysdeps/x86_64/multiarch/../strlen.S 的第 31 行。 ../sysdeps/x86_64/multiarch/../strlen.S:没有那个文件或目录。 在 ../sysdeps/x86_64/multiarch/../strlen.S 中。 (gdb) where #0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:31 #1 0x0000000000400b0e in transpose (s=0x0, capsDelta=120263, smallDelta=120257, numDelta=0) at mathtext.c:58 #2 0x0000000000400e2b in main (argc=2, argv=0x7fffffffe4b8) at mathtext.c:92