Как объяснить неопределенное поведение новичкам всезнайки? - PullRequest
34 голосов
/ 10 февраля 2010

Существует несколько ситуаций, которые стандарт C ++ приписывает неопределенному поведению. Например, если я выделю с помощью new[], то попробуйте освободить с помощью delete (не delete[]), это неопределенное поведение - все может произойти - это может сработать гадкий сбой, он может что-то испортить и вызвать временную проблему.

Это так проблематично объяснить , что может случиться часть с новичками. Они начинают «доказывать», что «это работает» (потому что это действительно работает в используемой ими реализации C ++) и спрашивают «что может быть не так с этим»? Какое краткое объяснение я мог бы дать, чтобы мотивировать их просто не писать такой код?

Ответы [ 18 ]

48 голосов
/ 10 февраля 2010

Undefined означает явно ненадежный. Программное обеспечение должно быть надежным. Тебе не нужно больше ничего говорить.

Замерзший пруд - хороший пример неопределенной поверхности для ходьбы. Тот факт, что вы сделали это один раз, не означает, что вы должны добавить ярлык в свой бумажный маршрут, особенно если вы планируете четыре сезона.

31 голосов
/ 10 февраля 2010

Мне на ум приходят две возможности:

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

  2. Более сложное решение может состоять в том, чтобы настроить другую среду компилятора / запуска, чтобы показать им, как она неожиданно выходит из строя при других обстоятельствах.

21 голосов
/ 10 февраля 2010

"Поздравляю, вы определили поведение, которое компилятор выполняет для этой операции. Я ожидаю, что отчет о поведении, который демонстрируют другие 200 существующих в мире компиляторов, появится у меня на столе к 10:00 завтра. Дон не разочаровывай меня сейчас, твое будущее выглядит многообещающим! "

14 голосов
/ 10 февраля 2010

Просто цитата из стандарта. Если они не могут принять это, они не программисты на C ++. Будут ли христиане отрицать Библию? ; -)

1,9 Выполнение программы

  1. Семантические описания в этом международном стандарте определяют параметризованный недетерминированный абстрактный механизм. [...]

  2. Некоторые аспекты и операции абстрактной машины описаны в этом международном стандарте как определяемый реализацией (например, sizeof(int)). Они составляют параметры абстрактной машины. Каждая реализация должна включать документацию, описывающую ее характеристики и поведение в этих отношениях . [...]

  3. Некоторые другие аспекты и операции абстрактной машины описаны в этом международном стандарте как не указано (например, порядок вычисления аргументов функции). Где возможно, этот международный стандарт определяет набор допустимых поведений . Они определяют недетерминированные аспекты абстрактной машины. [...]

  4. Некоторые другие операции описаны в этом международном стандарте как undefined (например, эффект разыменования нулевого указателя). [Примечание: этот международный стандарт не устанавливает требований к поведению программ, которые содержат неопределенное поведение . —Конечная записка]

Вы не можете получить ничего более ясного, чем это.

12 голосов
/ 10 февраля 2010

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

3 голосов
/ 10 февраля 2010

Спокойно переопределите новый, новый [], удалите и удалите [] и посмотрите, сколько времени он заметит;)

Если это не так ... просто скажите ему, что он не прав, и укажите ему на спецификацию C ++. О да ... и в следующий раз будьте внимательнее, когда нанимаете людей, чтобы избежать пробоин!

3 голосов
/ 10 февраля 2010

Мне нравится эта цитата:

Неопределенное поведение: оно может повредить ваши файлы, отформатировать диск или отправить ненавистную почту твой босс.

Я не знаю, кому это можно приписать (возможно, это из Эффективный C ++ )?

3 голосов
/ 29 мая 2012

Превратите человека в указатель. Скажите им, что они являются указателем на класс человек, и вы вызываете функцию «RemoveCoat». Когда они указывают на человека и говорят «RemoveCoat», все в порядке. Если у человека нет пальто, не стоит беспокоиться - мы проверяем это, все, что действительно делает RemoveCoat, это снимает верхний слой одежды (с проверкой на порядочность).

Теперь, что происходит, если они указывают куда-то случайным образом и говорят «Удалить пальто» - если они указывают на стену, краска может отслоиться, если они указывают на дерево, от которого может оторваться кора, собаки могут побриться, USS Enterprise может опустить свои щиты в критический момент и т. Д.!

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

3 голосов
/ 10 февраля 2010

Пусть попробуют, пока их код не рухнет во время теста. Тогда слова не понадобятся.

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

3 голосов
/ 10 февраля 2010

Джон Вудс :

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

«Демоны могут вылететь из носа» просто должны быть частью словаря каждого программиста.

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

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