va_arg (ap, unsigned int), когда аргумент `подписан int` и наоборот - PullRequest
2 голосов
/ 02 июля 2019

Я заметил, что 7.16.1.1p2 стандарта C разрешает доступ к аргументу с переменным значением, используя тип, который несовместим с фактическим типом аргумента с переменным аргументом, если тип, заданный с помощью va_arg, отличается от соответствующий фактический тип аргумента переменной только в подписи…:

... поведение не определено, за исключением следующих случаев:

  • один тип является целочисленным типом со знаком, другой тип является соответствующим целочисленный тип без знака, и значение представимо в обоих типах;
  • один тип - указатель на void, а другой - указатель на символ тип.

и значение представлено в обоих типах .

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

6.5p7

Объект должен иметь свое сохраненное значение, доступное только через lvalue выражение, которое имеет один из следующих типов: 88)

  • ...
  • тип, который является типом со знаком или без знака, соответствующим эффективный тип объекта,
  • ...

В чем причина этого несоответствия? Почему доступ с va_arg с другой подписью, а не доступ с указателем с другой подписью должен заботиться о представимости значения?

...