Является ли этот код хорошо определенным поведением с точки зрения строгого алиасинга?
_Bool* array = malloc(n);
memset(array, 0xFF, n);
_Bool x = array[0];
Правило эффективного типа имеет особые случаи для memcpy
и memmove
(C17 6.5 §6), но не для memset
.
Я считаю, что эффективным типом становится unsigned char
. Поскольку второй параметр memset
требуется преобразовать в unsigned char
(C17 7.24.6.1) и из-за правила действующего типа (C17 6.5 §6):
... или копируется как массив символьного типа, тогда эффективный тип
измененного объекта для этого доступа и для последующих доступов, которые не изменяют
значение - это эффективный тип объекта, из которого копируется значение, если оно есть.
- Вопрос 1: Каков эффективный тип данных, хранящихся в
array
после вызова memset
?
- Вопрос 2: Нарушает ли доступ
array[0]
строгий псевдоним? Поскольку _Bool
не является типом, исключенным из правила строгого наложения имен (в отличие от типов символов).