Является ли поведение указателя 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" ), как видно из этого ответа, всегда терпит крах, и я не вижу, как это не может работать - или оптимизироваться компилятором.