(Во-первых, обратите внимание, что я знаю, что определение порядков байтов во время выполнения не является идеальным решением, и есть лучшие идеи. Пожалуйста, не поднимайте этот вопрос)
Мне нужно проверить порядок байтов моего процессора во время выполнения. Я также должен делать это, оставаясь при этом совместимым с MISRA. Я использую C99.
MISRA не допускает преобразования между различными типами указателей, поэтому простое приведение uint32_t*
к uint8_t*
и разыменование, чтобы увидеть, какое значение содержит uint8_t
, не допускается. Об использовании union
s также не может быть и речи (MISRA не разрешает union
s).
Я также попытался использовать memcmp
, как в следующем фрагменте кода:
static endi get_endianess(void)
{
uint32_t a = 1U;
uint8_t b = 1U;
return memcmp(&a, &b, 1) == 0 ? endi_little : endi_big;
}
но MISRA говорит, что The pointer arguments to the Standard Library function 'memcmp' are not pointers to qualified or unqualified versions of compatible types
, что означает, что мне не удалось перехитрить его, преобразовав в допустимые указатели void*
и позволив memcmp
делать грязную работу.
Любые другие умные идеи будут оценены. Если у вас нет средства проверки MISRA, просто пришлите мне свою идею, и я дам вам знать, что говорит моя проверка.
endian.h
?return __BYTE_ORDER == __LITTLE_ENDIAN ? endi_little : endi_big
- person Christian Gibbons   schedule 20.02.2019C99
, но упомянулиC11
в вопросе. Я не знаю, действительно ли это так сильно влияет на ваш вопрос, но, насколько я знаю, MISRA не поддерживаетC11
. - person Christian Gibbons   schedule 20.02.2019char
вместоuint8_t
. Все равно будет жаловаться? - person Eugene Sh.   schedule 20.02.2019Operand to a unary operator has an inappropriate essential type 'unsigned char'
@SergeyA Это очень скучная причина, которую трудно объяснить, нет веской причины, по которой @ChristianGibbons endian.h недоступен для некоторых моих целей @ChristianGibbons Я хотел сказать C99, мой плохой @ ЕвгенийШ. Да, он все еще жалуется. Спасибо всем за ваши попытки помочь. - person Omer Tuchfeld   schedule 21.02.2019endian.h
должен. - person SergeyA   schedule 21.02.2019