Есть необходимые части, чтобы сформулировать мою проблему.Ниже приведено содержимое заголовочного файла 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?