Приводит ли кучи хранилище из константного к неконстантному неопределенное поведение? - PullRequest
0 голосов
/ 03 мая 2018

Стандарт говорит:

(6.7.3) Если предпринята попытка изменить объект определяется с помощью const-квалифицированного типа посредством использования lvalue с неконстантный тип, поведение не определено.

А в разделе неопределенного поведения:

Предпринята попытка изменить объект, определенный с квалифицированный const тип с использованием lvalue с неконстантный тип (6.7.3)

Возвращаемое значение malloc является блоком неинициализированного хранилища . В этом хранилище не было построено объекта .

Тем не менее, приведенный ниже код является законным?

#include
#include

typedef struct {
    unsigned char h;
    const unsigned int v;
} liber_primus;

int main(int argc, const char **argv)
{
    unsigned int lykilord;

    if (!(argc - 1))
        return 0;

    liber_primus *runaljod = malloc(sizeof (*runaljod));

    if (!runaljod)
        abort();

    runaljod->h = *(unsigned char *)argv[1];
    *(unsigned int *)&runaljod->v = 3307U;

    lykilord = runaljod->h * runaljod->v;

    free(runaljod);

    return lykilord;
}
...