Инициализирует декларатор указателя с неверным указателем неопределенное поведение? - PullRequest
0 голосов
/ 26 мая 2018

Короче говоря, считается ли следующий код неопределенным поведением?

int main()
{
    int *p = <some invalid pointer value>;
}

Для примера компиляции возьмите следующий код:

int main()
{
    int *p = new int;
    delete p; // Now p has an invalid pointer value.
    int *q = p; // UB?
}

Я провел некоторое исследованиепо теме, так что это соответствующая информация, которую я нашел до сих пор:

Значение указателя (согласно cppreference ) может быть одним из:

  • Указатель на объект или функцию;
  • указатель за концом объекта;
  • значение нулевого указателя;
  • недопустимое значение указателя.

Кроме того, согласно cppreference,

Переадресация через недопустимое значение указателя и передача недопустимого значения указателя в функцию освобождения имеет неопределенное поведение.Любое другое использование недопустимого значения указателя имеет поведение, определяемое реализацией.

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

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

Я не уверен, как обстоят дела с C ++, но я бы хотелУчтите, что, учитывая ответы в связанной ветке, использует недопустимых указателей, что приводит к неопределенному поведению.Обратите внимание, что присваивание отличается от initialization , поэтому я не уверен, что инициализация считается использованием.

1 Ответ

0 голосов
/ 26 мая 2018

Вы почти все ответили на это сами: это реализация, определенная , а не undefined , в C ++.Стандарт гласит только то, что вы цитировали (что я нашел, посоветовавшись с соответствующим индексом ).Не имеет значения, инициализирована ли она: использование lvalue-to-rvalue для объекта указателя явно представляет собой использование.

...