Может ли эта memcpy привести к неопределенному поведению?

Модификаторы

задаются как второй параметр:

new RegExp('[\\?&]' + name + '=([^&#]*)', "i")
0
задан Reinier Torenbeek 18 January 2019 в 15:21
поделиться

1 ответ

const -квалификаторы для членов позволяют компилятору предполагать, что - после инициализации объекта - эти члены не должны быть изменены каким-либо образом, и он может оптимизировать код соответствующим образом (см., Например, комментарий @Ajay Brahmakshatriya ).

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

Я думаю, что есть главное различие между вашим примером и тем, что вы приняли в принятом ответе. В этом SO-ответе, целевой агрегатный объект с константными типами элементов создается через malloc:

ImmutablePoint init = { .x = x, .y = y };
ImmutablePoint *p = malloc(sizeof *p);
memcpy(p, &init, sizeof *p);

Согласно правилам того, как хранимое значение объекта может доступ (см. эту часть онлайн-проекта стандарта c ), целевой объект p впервые получит свой эффективный тип в ходе выполнения memcpy; эффективный тип - это тип исходного объекта init, а первый memcpy объекта, получившего malloced, можно рассматривать как инициализацию. Однако впоследствии изменение константных членов целевого объекта будет UB (я думаю, что даже секунда memcpy будет UB, но это, вероятно, основано на мнении).

6.5 Выражения

  1. Эффективным типом объекта для доступа к его сохраненному значению является объявленный тип объекта, если таковой имеется. 87) ... Если значение копируется в объект, не имеющий объявленного типа, используя memcpy или memmove, или копируется как массив символьного типа, , тогда эффективный тип модифицированного объекта для этот доступ и для последующих обращений, которые не изменяют значение, является эффективным типом объекта, из которого копируется значение , если оно имеется. Для всех других обращений к объекту, у которого нет объявленного типа, эффективным типом объекта является просто тип lvalue, используемого для доступа.

87) Выделенные объекты не имеют объявленного типа.

Однако в вашем примере целевой объект dst уже имеет объявленный тип в своем определении struct vector dst;. Следовательно, const-квалификаторы на элементах dst уже существуют до применения memcpy, и его следует рассматривать как назначение, а не инициализацию.

Так что я бы проголосовал за UB в этом случае.

0
ответ дан Stephan Lechner 18 January 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: