微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串连接、log4cplus 和 MISRA 合规性

如何解决字符串连接、log4cplus 和 MISRA 合规性

我正在使用 log4cplus,并且我的misra-checks 看起来像无辜的东西

LOG4CPLUS_INFO(
        logger,std::string("ABC") + std::string("DEF"));

产量(除其他外)The underlying type of `0L` is implicitly reduced from `8-bit signed char` to {code{bool}}.。当我将相应的文字放入而不是将它们包装在 string 中时,也会发生这种情况。我想知道如何解决这个问题。或者,更笼统地说,您将如何连接多条日志消息,同时让 MISRA 检查满意?

解决方法

我查看了 LOG4CPLUS_INFO,这是一个定义为的宏:

#if !defined(LOG4CPLUS_DISABLE_INFO)
#define LOG4CPLUS_INFO(logger,logEvent)                                \
    LOG4CPLUS_MACRO_BODY (logger,logEvent,INFO_LOG_LEVEL)

LOG4CPLUS_MACRO_BODY 定义为:

 #define LOG4CPLUS_MACRO_BODY(logger,logLevel)                \
     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
     do {                                                                \
         log4cplus::Logger const & _l                                    \
             = log4cplus::detail::macros_get_logger (logger);            \
         if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
                 _l.isEnabledFor (log4cplus::logLevel),logLevel)) {     \
             LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
             _log4cplus_buf << logEvent;                                 \
             log4cplus::detail::macro_forced_log (_l,\
                 log4cplus::logLevel,_log4cplus_buf.str(),\
                 __FILE__,__LINE__,LOG4CPLUS_MACRO_FUNCTION ());       \
         }                                                               \
     } while (0)                                                         \
     LOG4CPLUS_RESTORE_DOWHILE_WARNING()

因此您的 MISRA 检查器将检查宏的调用。并且 MISRA 喜欢根据 if 明确定义 bool 语句,例如而不是 if(node) 它喜欢 if(node!=nullptr) 并且我认为它的最后一行可能有问题:

     } while (0)                                                         \

因为 0 被隐式转换为 bool。您应该通过在代码中添加一个简单的 do{}while(0); 循环并再次运行检查器来查看是否收到相同的警告。


如果您想要一种 MISRA 安全的日志记录方式,我会避免使用宏。您可以使用 std::ofstreamstd::mutex 创建一个简单的日志记录类,并将其保留在定义为头文件中的 extern 的命名空间范围内。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。