Присвоение собственного собственного значения его значению
Является ли следующий код undefined поведение, реализация определена или определена стандартом?
Я не мог найти ссылки на назначение целого числа по его собственному адресу.
volatile int x = (int)&x;
Этот код переводится на:
lea eax,[ebp-4]
mov dword ptr [ebp-4],eax
Ответы
Ответ 1
В C, используя x
как в объявлении, так и в инициализации в порядке:
(C99, 6.2.1p7) "[...] Любой другой идентификатор имеет область действия, которая начинается сразу после завершения его декларатора."
Результат преобразования указателя на целое определяется реализацией и может быть undefined поведением:
(C99, 6.3.2.3p7) "Любой тип указателя может быть преобразован в целочисленный тип. За исключением того, что указано ранее, результат определяется реализацией. Если результат не может быть представлен в целочисленном типе, поведение undefined. Результат не должен находиться в диапазоне значений любого целочисленного типа."
Ответ 2
В С++, в соответствии с пунктом правила объявления. Это хорошо определено. Поскольку перед =
объявлена переменная x
, а затем &x
.
Вот сложная точка, ниже кода undefined поведение:
int x = x; // undefined behavior, using uninitialized variable
но...
int x = (int)&x; // defined behavior
Я говорю о С++, но я считаю, что он действителен и для C.
Ответ 3
В показанном ASM-коде значение указателя сначала помещается в eax
, а затем указатель считывается из eax
и помещается в то же место, что и значение целого.
Единственная проблема здесь в том, что int
не всегда имеет тот же размер, что и int*
. На моей 64-битной машине int
- 4 байта, а указатели - 8 байтов. Если бы я запустил ваш код в своем ящике, я бы получил только половину указателя.