(Первое замечание, что я знаю, что определение порядка байтов во время выполнения не является идеальным решением, и есть лучшие идеи. Пожалуйста, не говорите об этом)
Мне нужно проверить порядок байтов моего процессора ввремя выполнения.Я также должен сделать это, оставаясь 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, просто пришлите мне свою идею, и я сообщу вам, что говорит мой контролер