如何解决此MISRA警告:C

How to resolve this MISRA warning: C++

本文关键字:MISRA 警告 何解决 解决      更新时间:2023-10-16

这是以下代码:

  std::stringstream os;
  os << std::hex; // MISRA warning on this line
  os << std::setw(2);
  os << std::setfill('0');

警告:"必需的规则8-4-4,无需'&amp;'使用的函数标识符或括号的参数列表"

我无法解决这个问题,请建议解决方案。

执行警告说的事情:获取功能的地址:

os << &std::hex;

仅使用建议的 &怎么样?

#include <iomanip>
#include <iostream>
#include <sstream>
int main() {
    std::stringstream os;
    os << &std::hex; // Works with &
    os << std::setw(2);
    os << std::setfill('0');
    os << 13;
    std::cout << os.str() << "n";
    return 0;
}

是的,它也有效。


有什么区别?

  • std::hex参考 to function
  • &std::hex指针 function

由于引用功能的引用具有隐式转换到指示器的功能,因此您可以将其传递到ostream,并且可以按预期工作。显然,Misra要求您明确说明您是我想要函数还是我想调用函数。。

你可以做

std::hex(std::cout);

等效于

std::cout << std::hex;

将摆脱警告。或者,使用

std::cout << &std::hex;

,但这看起来确实很丑,尽管它是正确的。

底线是,Misra在这里是"错误的"/尴尬/意外。std::hex可以像您没有任何问题一样使用。

也许这是主题的,但要使用std :: stringstream和streams。它具有状态,默认情况下它不会投掷。因此,如果内存不足,它只是设置了一个"错误"标志,而不是抛出std :: bas_alloc,这可能是非常棘手的错误并崩溃的来源。

检查http://www.cplusplus.com/reference/ios/ios/exceptions/

os << std::hex;

最终调用过载

basic_ostream<charT,traits>& basic_ostream::operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))

这是operator<<()过载,它将指针带到具有basic_ostream<>参数的函数。那就是std::hex在这里。

operator<<()过载只是通过指针调用功能。因此,您可以执行以下任何等效的操作:

os << &std::hex;    // makes the function pointer explicit using the & operator
std::hex(os);       // call the `std::hex` function using a normal function call syntax
// or directly call the function that `std::hex(os)` is specified to do:
os.setf(std::ios_base::hex, std::ios_base::basefield);

Misra抱怨将输出流设置为十六进制格式的惯用方式真是太糟糕了。

首先,您所显示的代码对我来说很标准。

我看到了一些可能的解释和方法来解决警告:

  1. 流操作器std::hex实现了MISRA-符合形式。

    a)不要使用std::hex

    b)修复std::hex。尝试在环境中查找std::hex的实现。

  2. 包括std :: hex在内的代码是一致的,但警告是错误的。

    a)忽略或抑制警告。

    b)向编译器或代码验证器的供应商提出错误报告。

您确实有三个选择:

  1. 请勿使用std::hex
  2. cout<<&std::hex
  3. 从Misra标准提出偏差请求

第一个选项可能不实用,第二个选择是奇怪的。

幸运的是,米斯拉的标准期望不遵循这些规则 - 从米斯拉·c标准(这是我唯一要交给的文字)

严格遵守所有规则是不太可能的,实际上,与个人情况相关的偏差是可以接受的。

当然,这并不意味着您可以做自己想做的,而是标准期望偏差请求将提交 - 这是如何完成的,您的QMS应该覆盖它。就您的工具而言,可能有一个可以忽略的选择。