Что происходит при использовании адреса до его выделения?

Очень простая часть кода на C ++ ниже неверна, легко понять, почему и такие инструменты, как Valgrind, расскажут вам. При запуске нескольких кодов C ++, содержащих этот тип ошибок, я заметил, что каждый раз он заканчивался тем, что в строке, которая пытается использовать строку Segmentation fault используйте адрес.

Итак, мой вопрос: безопасно ли утверждать, что попытка использовать адрес до его выделения будет неизбежно привести к Segmentation violation в соответствующей строке?

 class ClassType
{
  public:int data_;
};

....
// Using address before it's allocated
ClassType * ClassType_ptr;
int x = ClassType_ptr->data_;
3 голоса | спросил SebGR 19 FebruaryEurope/MoscowbTue, 19 Feb 2013 14:51:35 +0400000000pmTue, 19 Feb 2013 14:51:35 +040013 2013, 14:51:35

2 ответа


22

Нет, абсолютно не . Если бы это было всегда, мы могли бы использовать это в наших интересах и указать его в стандарте; известное поведение , даже если оно является сбоем, практически всегда лучше, чем поведение unknown .

Но вместо этого ответ системы зависит от деталей реализации, предыдущих действий программы, состояния среды выполнения и т. д. непредсказуемым образом. В современных операционных системах, ссылающихся на адрес, который не принадлежит вам, может обычно инициировать нарушение сегментации, но определенно не всегда. Нарушение сегментации может произойти, но не позже гораздо позже. Хуже того, ваша программа, возможно, работает, но тихо делает неправильную вещь. Вот почему языковой стандарт должен принять наихудший возможный вариант и объявить, что поведение undefined .

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

ответил Kilian Foth 19 FebruaryEurope/MoscowbTue, 19 Feb 2013 14:59:12 +0400000000pmTue, 19 Feb 2013 14:59:12 +040013 2013, 14:59:12
3

В машине и ОС я сначала сделал некоторое программирование на C ++, даже не имел seg faults, потому что у него не было защиты памяти.

Если я правильно напомню, что на этой платформе ваш фрагмент кода будет иметь исходный код ClassType_ptr, и разыменовать его (без ошибок ) возвращают первые четыре байта ОЗУ в виде целого числа. Не то, что вы хотели, конечно, но не сбой, никаких ошибок.

Вот почему, как сказал Килиан Фот в приведенном выше ответе, поведение не определено.

ответил Carson63000 19 FebruaryEurope/MoscowbTue, 19 Feb 2013 15:02:19 +0400000000pmTue, 19 Feb 2013 15:02:19 +040013 2013, 15:02:19

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132