MISRA-совместимое обнаружение байтов во время выполнения - PullRequest
0 голосов
/ 20 февраля 2019

(Первое замечание, что я знаю, что определение порядка байтов во время выполнения не является идеальным решением, и есть лучшие идеи. Пожалуйста, не говорите об этом)

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

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я думаю, вы неправильно поняли правила MISRA-C.Код, подобный этому, подойдет:

 uint16_t u16 = 0xAABBu;
 bool big_endian = *(uint8_t*)&u16 == 0xAAu;

MISRA-C: 2012 правило 11.3 имеет исключение, разрешающее преобразование указателя в указатель на типы символов (которые можно смело считать uint8_t), но не другойнаоборот.Целью этого правила является защита от смещенного доступа и ошибок наложения псевдонимов.


Кроме того, MISRA позволяет union очень хорошо, правило против этого носит рекомендательный характер, просто заставляет людей останавливаться и думать как они используют союзы.MISRA не позволяет union ради хранения нескольких несвязанных вещей в одной и той же области памяти, таких как создание вариантов и другой подобной чепухи.Но с помощью MISRA можно использовать штампование с контролируемым типом, в котором учитывается заполнение / выравнивание и порядок байтов.То есть, если вам не нравится это консультативное правило.Лично я всегда игнорирую это в моих реализациях MISRA.

0 голосов
/ 21 февраля 2019

В контексте MISRA, я полагаю, этот заголовок и эта функция могут быть недоступны, но:

#include <arpa/inet.h>

static endi get_endianness(void)
{
    return htons(0x0001u) == 0x0001u ? endi_big : endi_little;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...