Эффективный тип временного объекта в C - PullRequest
0 голосов
/ 17 февраля 2019

Это вопрос, связанный с сообщением о дефекте 452 стандарта C.Документ N1888 содержит дополнительную информацию об исходной проблеме, но я не могу понять, почему в ней говорится следующее:

Правило действующего типа из 6.5.p6 (правило, описывающее, чтоэффективный тип объекта), по-видимому, не применяется к объекту с временным временем жизни в результате выражения запятой.Как таковой, он, кажется, не имеет эффективного типа. Таким образом, типизирование типов разрешено, по-видимому, разрешено :

long func3() {
   union u2 o3 = { .x=42 };
   return (0, o3).y;
}

Мой вопрос заключается в том, что делает типизацию типа punning законной, если объект с временным временем жизни создан выражением (0, o3)не имеет эффективного типа?Я полагаю, что эффективный тип этого объекта был бы уместен, только если бы кто-то попытался получить доступ к его сохраненному значению, используя другой тип, но я не вижу, как это имеет место здесь.

1 Ответ

0 голосов
/ 19 февраля 2019

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

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

union u2 {
    int x;
    long y;
    char ca[2];
  };

Элементы x и y имеют разные типы (даже если они могутимеют одинаковое представление).

Но когда речь идет о профсоюзах, нельзя сказать, что мы получаем доступ к одному объекту по типу другого (я знаю, что по этому поводу есть споры, но есть примечаниев стандарте, разрешающем наказание типов через союзы; я знаю, что примечания не являются нормативными, но я считаю, что цель состояла в том, чтобы сделать его действительным).стандарт :

Если элемент, используемый для чтения содержимого объекта объединения, не совпадает с элементом, который последний раз использовался для хранения значения в объекте, соответствующая часть представления объекта значения повторно интерпретируется как представление объекта вновый тип, как описано в 6.2.6 (процесс, иногда называемый '' наказанием типа '').Это может быть представление ловушки.

Вам нужно определить, что вы подразумеваете под valid , но в соответствии с вышеизложенным, это не может означать «гарантированное поведение, как определеностандарт ", поскольку это может привести к" представлению ловушек ", то есть неопределенному поведению при чтении.

...