Каким может быть альтернативный способ устранения нарушения правила 17.3 MISRA 2012? - PullRequest
0 голосов
/ 04 мая 2018

MISRA 2012 Правило 17.3 гласит, что функция никогда не должна объявляться неявно. Однако в этом случае в строке № 6 pf_func нарушает правило MISRA 2012 17.3.

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
void main(FOREACH_FUNC pf_func)
{
    uint64 var;
    pf_func(var);   /*Violation reported on this line*/
}

Здесь pf_func вызывает нарушение правила 17.3 MISRA. Это нарушение действительно или это ошибка в инструменте статического анализа, который я использую. Кроме того, есть ли альтернативное решение, чтобы избежать этого нарушения без изменения рабочего процесса кода?

Однако, когда я изменяю код на это -

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
FOREACH_FUNC pf_func(uint64 ull_key);
void main()
{
    uint64 var;
    pf_func(var);
}

для правила № 17.3 нарушения не зарегистрировано. Я не могу понять работу указателя функции здесь. Это правильный или этический способ решить эту проблему? Или есть неисправность в самом инструменте статического анализа?

1 Ответ

0 голосов
/ 04 мая 2018

Правило 17.3 - это "функция не должна быть объявлена ​​неявно" и относится к старому способу C90, позволяющему вызывать функции, даже если нет объявления формата прототипа.

Ваш код этого не делает. Все, что он делает - это вызывает функцию через указатель на функцию. Таким образом, нарушения MISRA нет, это ложное срабатывание и ошибка в вашем статическом анализаторе.

Однако, предполагая, что вы используете C99 или более позднюю версию, предпочтительнее использовать stdint.h над целочисленными типами домашнего приготовления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...