Является ли поведение указателя wereer undefined неопределенным указателем в Objective-C?
В C и С++ разыменование нулевого указателя имеет поведение undefined. Что насчет Objective-C?
Другими словами, что гарантируется этот код?
*(long*)0 = 0;
Предыстория: Интересно, может ли этот ответ вызвать поведение undefined, потенциально вызывающее случайные вещи, такие как оптимизируемое утверждение или даже более странные вещи.
Конечно, я не поддерживаю это. Тем не менее, важно знать правила языка.
Ответы
Ответ 1
Так как Objective-C - это не что иное, как объектно-ориентированный слой поверх C, чистые выражения C не имеют специальных дополнительных значений. В соответствии с этим в этом случае *(long*)0 = 0;
оценивается и интерпретируется точно так же, как и в C (поскольку это C) и, следовательно, вызывает поведение undefined. Таким образом, не гарантируется ничего.
Ответ 2
Разыменование нулевого указателя остается undefined в Objective-C.
Единственное предостережение в том, что обмен сообщениями не требует разыменования. Обмен сообщениями с нулевым указателем (или nil
в терминах Objective-C) всегда явно безопасен и определен для возврата следующего нулевого указателя.
Следовательно, сложный обмен сообщениями, например [[class alloc] init]
, всегда явно безопасен.
Ответ 3
Единственное, что гарантируется это утверждение, - это вызвать поведение undefined.
Может быть гарантировано что-то конкретное на конкретной платформе с конкретным компилятором.
Ответ 4
a strcpy (0, "bla" ), как видно из этого ответа, всегда терпит крах, и я не вижу, как это не может работать - или оптимизироваться компилятором.