Является ли «ошибка сегментации» системной ошибкой или ошибкой программы?

Редактор QED , написанный в 1965 году для системы разделения времени Беркли , использовал $для обращения к последней строке в файле , точно так же, как ed, ex, viи vimделает сегодня. См. стр. 2 -1 в руководстве . Однако исходный редактор QED не позволял использовать регулярные выражения.

Кен Томпсон позднее («в конце 1960-х» )написал версию QED для Multics, которая стала первым редактором, реализующим регулярные выражения. Этот редактор сильно повлиял на разработку Кеном edв 1969 году для Unix (, позже «доработанную» Деннисом Ричи примерно в 1971 году ). Билл Джой, разочаровавшись в ed, реализовал exи vi, и они были частью первого выпуска BSD в 1977 году для PDP -11.

Выражения ^и $вместе с большей частью того, что стало синтаксисом регулярных выражений POSIX, с семантикой, которую он имеет сегодня, были реализованы в версии QED Кена. См. , стр. 4 в руководстве .

Неясно, откуда взялся выбор этих конкретных символов, но $уже имело значение «последний» из-за того, как оно использовалось для обращения к последней строке.

На некоторых терминалах невозможно было сгенерировать символ ^. Поэтому редактор QED Кена разрешил использовать \'вместо ^(, см. руководство Bell Labs).

14
22.04.2020, 18:05
2 ответа

Ошибка сегментации возникает при доступе к областям памяти, доступ к которым запрещен. Часто это происходит из-за разыменования нулевого указателя или доступа к памяти за пределами выделенной памяти.

Если полный набор данных работает, а подмножество — нет:

  • проверьте, правильно ли программа обрабатывает тот факт, что набор данных не содержит признаков (может быть, вы выделяете массив на основе признаков, существующих в наборе данных, но затем предполагаете длину на основе известного списка признаков из полного набора данных?)
  • Является ли какая-либо группа пустой, и это вызывает проблему? Как правило, какие-либо ошибки с -на -one, которые проявлялись бы, если бы массив был пуст?
5
19.03.2021, 02:26

Это может быть вызвано и тем, и другим. Чаще всего это программная ошибка, как описал Крис, но некоторые аппаратные проблемы (, особенно плохая память и плохое питание ), также могут привести к segfaults. Неверное значение считывается из памяти, что приводит к выполнению поврежденной инструкции, чтению поврежденного указателя, использованию поврежденной таблицы страниц и т. д. Все это приводит к segfault.

Разница, тем не менее, заключается в том, что аппаратные -сбои сегментации в значительной степени случайны , вызваны одним -из -нескольких -миллионов событий переключения битов (, если система более нестабильна, она даже не загружается ). С другой стороны, ошибки Segfault, вызванные программными ошибками, могут быть полностью повторяемыми.

3
19.03.2021, 02:26

Теги

Похожие вопросы