Для фактического вопроса перейдите к вопрос часть. Для интересного реального примера неопределенного поведения продолжайте читать:)
Было это перечисление:
struct EnumStruct
{
enum Enum
{
val0 = 0,
val1,
val2,
val3,
val4
};
};
и в некоторой функции у нас было это:
const int arrayCount = 6;
int arr[] = {
EnumStruct::val0,
EnumStruct::val1,
EnumStruct::val2,
EnumStruct::val3,
EnumStruct::val4
InvalidValue
};
Затем был цикл, который помещал arrayCount
элементы arr
в файл. Это была процедура Prepare()
для модульных тестов. И модульный тест должен был проверить наличие InvalidValue
в файле. Мне был назначен дефект о том, что модульный тест не пройден. Это отлично работает на моей машине, хотя. После нескольких часов отладки я заметил, что InvalidValue
на самом деле #define
d как -1
, и после val4
пропущена запятая. Вы можете только представить ругательства, которые вышли из моих уст в адрес того, кто написал этот код (на самом деле он работал более 3 лет).
Теперь, как вы можете видеть, массив фактически состоит из 5 значений - 0, 1, 2, 3, 3
, но цикл также записывает в файл 6-й элемент, что, конечно, является неопределенным поведением. Теперь, хотя технически он является неопределенным, в Windows с MSVC сбоев не происходит - он просто записывает мусор, который находится в этом месте памяти. Дело в том, что если мусор окажется не таким, как 0, 1, 2, 3, or 4
, модульные тесты пройдут успешно.
Вопрос : Похоже, что файл .vcproj
UT каким-то образом исправлен до его создания. Я не знаю, как они это делают, но с их элементами массива build-of-of-bound всегда равны 0. Мне кажется, что вся виртуальная память установлена в 0 перед выполнением программы. Что это за настройка проекта? Или я воображаю вещи?
Я имею в виду, что если бы это была просто удача, что массив находился за пределами 0, то при многократном выполнении моя удача потерпела бы неудачу, не так ли? Но это всегда 0 ... Я в замешательстве.
Кстати, когда я строю один и тот же проект, элемент «вне границ» всегда имеет разные значения при каждом выполнении. Можете ли вы объяснить это? Спасибо.