Как исправить в этом коде упомянутую проблему с нарушениями MISRA-2012 10.4 и 10.9? - PullRequest
0 голосов
/ 22 мая 2019

Есть необходимые части, чтобы сформулировать мою проблему.Ниже приведено содержимое заголовочного файла MyError.h.


myError.h

###########################
# myError.h
###########################

1  typedef enum
2  {
3     MySuccess = 0x00000000,
4     MyError1  = 0x00000001,
5     MyError2  = 0x00000003,
6     MyForce32 = 0x7FFFFFFF
7  } MyError;

8  #define PROPAGATE_ERROR_FAIL_MY_1(_err) \
9  do { \
10    e = (_err); \
11    if (e != MySuccess) \
12   { \
13       MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
14        goto fail; \
15    } \
16 } while (0)


17  #define MY_UTILS_LOG_ERROR(_err, _file, _func, _line, _propagating, _format, ...) \
18  do { \
19    MyUtilsLogError(MY_UTILS_ERROR_TAG, MY_UTILS_ERROR_PATH, \
20                            (_err), (_file), (_func), (_line), \
21                            (_propagating), (_format), ##__VA_ARGS__); \
22 } \
23 while (0)

24 void MyUtilsLogError(const char* tag, const char* path, MyError e, const char* file, const char* func,
                    uint32_t line, bool propagating, const char* format, ...)
//Here MyError is passed just to print the String for Error for example if we pass MyError1 then string MyError1 will be printed in logs on console.

Ниже приведены необходимые фрагменты из файла MyError.c, которые просто включаютВышеупомянутый файл заголовка и вызывает макрос PROPAGATE_ERROR_FAIL_MY_1 в API.


myError.c

#include "myerror.h"

static MyError foo(uint32_t x, uint32_t y) {
    if (x==y) {
        return MySuccess;
    } else {
        return MyError1;
    }
}

static MyError fooCaller(void) {
    MyError e = MySuccess;
    uint32_t x = 1U, y = 1U;

    PROPAGATE_ERROR_FAIL_MY_1(foo(x,y)); //This is where I get all kind of weird MISRA violation [1][2].

fail:
    return e;
}

ПРИМЕЧАНИЕ: FYI MyUtilsLogError () - это просто APIкоторая помогает в выводе журналов на консоль.

В файле myError.c, которые я вижу ниже, нарушения MISRA 2012:

[1]: misra_c_2012_rule_10_4_violation: Основной тип левого операнда «e» (enum) отличается от правого операнда «MySuccess» (логическое значение).

[2]: misra_c_2012_rule_11_9_violation: литерал «0» не должен использоваться как константа нулевого указателя.

Я не понимаю, почему MISRA сообщает о нарушении 10.4, даже если я сравниваю тот же тип перечисления в строке # 11 в файле myErro.h?

Есть какие-либо подсказки, почему здесь сообщается о нарушении 10.9?Разве макрос не подходит для использования с MISRA?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я мог бы решить проблемы с помощью следующего подхода:

Проблема [1] : misra_c_2012_rule_10_4_violation: Основной тип левого операнда «e» (enum) не совпадает с типом правого операнда «MySuccess» (булево).

==> Исправление: Исправление нарушения правила 10.4:

8  #define PROPAGATE_ERROR_FAIL_MY_1(_err) \
9  do { \
10    e = (_err); \
11  + MyError errSuccess = MySuccess; /* This fixes the 10.4 violations */\ 
11    if (e != MySuccess) \
12   { \
13       MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
14        goto fail; \
15    } \
16 } while (0)

Таким образом, удержание MySuccess в отдельной переменной MyError помогает исправить ответ. Но я не знаю, как это решает проблему здесь? Кажется, без удержания MySuccess в отдельном расширении макроса var просто помещает его значение перед сравнением, и MISRA распознает это как нарушение.


Выпуск [2]: misra_c_2012_rule_11_9_violation: Литерал "0" не должен использоваться в качестве константы нулевого указателя.

==> Исправление: Исправление нарушения правила 11.9:

- 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
+ 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, ""); \

Это решает проблему, потому что функция MyUtilsLogError () ожидает формат: arg как указатель на const char (const char *). Поэтому мы не должны передавать 0, передавая "" для format arg исправляет нарушения правила 11.9.

0 голосов
/ 22 мая 2019

в

static MyError foo(uint32_t x, uint32_y) {

Вы хотите

static MyError foo(uint32_t x, uint32_t y) {

В

     if (e != MYSuccess) \

Вы хотите

     if (e != MySuccess) \

В

 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \

недостаточно аргументов, ISO C99 требует как минимум один аргумент для "..." в макросе с переменными числами

предупреждение ISO C не поддерживает __FUNCTION__ предопределенный идентификатор

Также MyUtilsLogError не объявлено / не определено для вашего вопроса, какова его подпись?Знает ли он хотя бы, что такое MyError ?

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