гибкость и бизон и считывание: ошибка сегментарного сегмента

GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /path/to/drcalc...(no debugging symbols found)...done.
(gdb) r
Starting program: /path/to/cdrcalc 

Program received signal SIGSEGV, Segmentation fault.
0xb7e606b6 in ??() from /lib/i386-linux-gnu/libc.so.6
(gdb) 

Anybody can help? My code can be downloaded at https://github.com/dramforever/drcalc/ branch readline

1
nl ja de

2 ответы

Вы должны скомпилировать флаг -g , поэтому gdb может отображать больше информации об отладке. Если вы это сделаете, вы увидите, что при сбое программы inp_readline при попытке использовать sh_line , которая является NULL.

Причина в том, что вы даете sh_line 0 (который будет интерпретироваться как NULL-указатель) в качестве его начального значения, а затем в inp_readline вы проверяете, sh_line не является NULL, и в этом случае вы освобождаете старую строку и читаете новую с readline . Но если это NULL, с которой он начинается, ничего не делается, поэтому, когда вы дойдете до strlen (sh_line) , он по-прежнему равен NULL, а strlen .

<Сильный> EDIT:

В оригинале говорится:

if (sh_line) free(sh_line);sh_line=0; 
sh_line = readline(sh_Prompt);

но вы добавили некоторые фигурные скобки, чтобы вместо этого

if (sh_line) {free(sh_line);sh_line=0;
sh_line = readline(sh_Prompt);}

Вот почему readline никогда не вызывается.

2
добавлено
@ user1528601: Я добавил код в ответ.
добавлено автор Thomas Padron-McCarthy, источник
Итак, как я должен это исправить? Я ничего не знаю о readline и просто сделал copy-paste-edit из parafeed.googlecode.com/svn-history/r32/trunk/code/shell.l
добавлено автор user1528601, источник
PS спасибо за флаг -g. Я слишком молод, чтобы +1
добавлено автор user1528601, источник
Извините, я исправил это по-другому.
добавлено автор user1528601, источник

(I am the asker!)
I don't know anything about readline. so a good function definetion will work.
I chose https://github.com/jterrace/craq/blob/master/gmp-4.3.1/demos/calc/calcread.c

0
добавлено