Любое число, разделенное на 0 в C, подпадает ли оно под ошибку сегментации? - PullRequest
0 голосов
/ 04 июля 2018
int main()
{
    int x = 5, y = 0;
    int z = x / y;
    return 0;
}

Я знаю, что это происходит с неопределенным поведением, но означает ли это ошибку сегментации? А как процессор обрабатывает деление на 0 регистров?

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Если поведение не определено, это означает, что нет определения того, что происходит. Таким образом, постановка вопроса «означает ли это ошибку сегментации» означает, что вы упускаете суть. Все может случиться.

Кроме того, есть много процессоров, и вы не указываете один, поэтому ответить на вопрос «как процессор обрабатывает деление на 0», конечно, также невозможно.

Вы можете перехватывать исключения и обрабатывать их в коде.

0 голосов
/ 04 июля 2018

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

Существует ряд вещей, которые могут «убить» вашу программу, и все они могут быть классифицированы как исключения в этом отношении:

  • доступ к несуществующей памяти
  • неправильный доступ к памяти (смещение, запись только для чтения и т. Д.)
  • делить на 0
  • недопустимая инструкция
  • превышен лимит ресурсов (например, время процессора)
  • арифметическое переполнение

В Unix-подобных операционных системах доступ к несуществующей памяти обычно является «нарушением сегментации», в то время как неправильный доступ к памяти обычно является «ошибкой шины». (Под Windows они являются / были нарушением общей защиты и / или BSOD .)

И, как вы можете видеть, хотя деление на 0 является исключением, оно является братом нарушения сегментации, а не подмножеством.

(Я перечислил арифметическое переполнение как исключение, потому что оно может быть, а не потому, что обычно так и есть. Большинство современных систем, конечно, не рассматривают переполнение как исключение. Но по правилам C они могут, за исключением переполнения на целых числах без знака, которые необходимы для C, чтобы быть определенными и хорошо себя вести.)

В Unix-подобных операционных системах большинство / все эти исключения, как правило, сопоставляются с сигналами , которые ваша программа может перехватить, чтобы она могла (пытаться) продолжать, а не умирать.

(По иронии судьбы, в системе, где я только что попробовал, integer деление на 0 дает мне "исключение с плавающей точкой", в то время как деление с плавающей точкой на 0 дает IEEE -754 inf, что вовсе не исключение. Но это другой вопрос .)

...