Код оболочки Unix C: случайные ошибки - PullRequest
0 голосов
/ 14 января 2011

Я кодирую оболочку UNIX на C, и с тех пор, как я начал использовать GNU Readline, у меня возникают самые странные ошибки.

Ошибки сегментации и сигналы SIGABRT появляются практически полностью случайным образом.GDB никогда не показывает мне одну и ту же причину проблемы дважды.

Я отправляю свой код в пастбине.

Agros.h

Agros.c

Main.c

Я думаю, что я спрашиваю, может ли кто-нибудь помочь мне отладить или, по крайней мере, пересмотреть части моего кода, я был бы очень признателен.Я все еще новичок в программировании и буду очень признателен за любую помощь, которую смогу получить.

С уважением.

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Я попытался скомпилировать ваш код, и компилятор предупредил меня об опасной проблеме:

agros.c: In function ‘return_prompt’:
agros.c:114:5: warning: function returns address of local variable

Это типичная ошибка новичка, и она легко может быть причиной случайных ошибок, которые вы описываете. Значение возвращаемого вами «приглашения» будет перезаписано следующими параметрами вызова функции, поскольку оно находится в стеке вашей программы, что может привести к случайным «повреждениям» памяти.

1 голос
/ 14 января 2011

Я заметил, по крайней мере, что get_cmd_code () глючит.Я не углублялся в ваш код, поэтому исправьте это, и если у вас все еще есть проблемы, дайте мне знать.

У вас есть код, который перебирает статический массив элементов команды.Вы резервируете место для 100 элементов в начале файла (в объявлении массива), но фактически не инициализируете 100 элементов.my_commands [4] .command_name имеет значение null, поэтому его передача в strcmp () вызовет ошибку segfault.

Лучше установить постоянную k_command_count, а затем повторить цикл от 0 до k_command_count - 1. Вы также должны определитьmy_commands as my_commands [k_command_count], поэтому вы не тратите впустую память.Существуют и другие, еще более эффективные способы ведения дел, но пока вы учитесь, я предлагаю сделать это проще.

0 голосов
/ 14 января 2011

Я проверил общую ошибку программирования неправильно выделенной памяти, но все выглядит нормально.

Случайно, происходит ли сбой в работе, когда вводится пустая строка?Если это так, логика в parse_command(), которая обнаруживает пустую строку, вызывает другой вызов strtok(), когда это не должно быть.Было бы лучше полностью пропустить цикл while, как это должно произойти, если значение NULL не было изменено с помощью `word =" "` `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...