Я заметил, что 7.16.1.1p2 стандарта C разрешает доступ к аргументу с переменным значением, используя тип, который несовместим с фактическим типом аргумента с переменным аргументом, если тип, заданный с помощью va_arg
, отличается от соответствующий фактический тип аргумента переменной только в подписи…:
... поведение не определено, за исключением следующих случаев:
- один тип является целочисленным типом со знаком, другой тип является соответствующим
целочисленный тип без знака, и значение представимо в обоих типах;
- один тип - указатель на void, а другой - указатель на символ
тип.
и значение представлено в обоих типах .
Это последнее требование противоречит строгому правилу псевдонимов при доступе через указатели. Правило разрешает доступ к объекту через указатель, тип цели которого отличается от эффективного типа объекта только подписью, и правило делает это без дополнительного наложения каких-либо требований к значению целевого объекта:
6.5p7
Объект должен иметь свое сохраненное значение, доступное только через lvalue
выражение, которое имеет один из следующих типов: 88)
- ...
- тип, который является типом со знаком или без знака, соответствующим
эффективный тип объекта,
- ...
В чем причина этого несоответствия? Почему доступ с va_arg
с другой подписью, а не доступ с указателем с другой подписью должен заботиться о представимости значения?