如何解决此 MISRA 警告:C++

问题描述 投票:0回答:7

代码如下:

  std::stringstream os;

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

警告:“必需的规则 8-4-4,使用不带 '&' 或带括号的参数列表的函数标识符”

我无法解决这个问题,请提出解决方案。

c++ misra
7个回答
6
投票

按照警告执行操作:获取函数的地址:

os << &std::hex;

5
投票

像建议的那样使用

&
怎么样?

#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
    是功能参考
  • &std::hex
    是函数指针

由于对函数的引用具有到函数指针的隐式转换,因此您可以将其中任何一个传递给

ostream
,它将按预期工作。但显然,MISRA 要求您明确表示您的意思是“我想要该函数”还是“我想要调用该函数”。 你可以做


3
投票

相当于

std::cout << std::hex;

这将消除警告。或者,使用

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

但这看起来真的很难看,尽管它是正确的。

底线是,MISRA 在这里是“错误的”/尴尬的/出乎意料的。 
std::hex

可以像您一样使用,没有任何问题。

也许这是题外话,但一般要注意使用 std::stringstream 和流。它有一个状态,默认情况下它不会抛出异常。因此,如果内存不足,它只是设置一个“错误”标志,而不是抛出 std::bas_alloc,这可能是非常棘手的错误和崩溃的根源。


2
投票
http://www.cplusplus.com/reference/ios/ios/exceptions/

线路


1
投票

最终调用了重载

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

  1. cout<<&std::hex
  2. 提出
    偏离 MISRA 标准
    的请求
  3. 第一个选项可能不实用,第二个选项很恶心。
  4. 幸运的是,MISRA 标准期望这些规则不会被盲目地遵循 - 来自 MISRA C 标准(这是我唯一可以提供文本的标准)

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

这当然并不意味着您可以做您想做的事,相反,标准期望提交

偏差请求

- 如何完成此操作是当地的问题,以及您的质量管理体系(QMS)或您当地的流程手册的名称,应该覆盖它。就您的工具而言,可能有一个选项可以在每次出现时忽略。

首先,您显示的代码对我来说看起来非常标准。


0
投票

流操纵器

std::hex
    实现了符合MISRA标准。
  1. a) 不要使用

    std::hex

    b) 修复

    std::hex
    。尝试在您的环境中查找

    std::hex

    的实现。

    
    
    包含 std::hex 的代码是一致的,但警告是错误的。

  2. a) 忽略或抑制警告。
  3. b) 向编译器或代码验证器的供应商提交错误报告。

© www.soinside.com 2019 - 2024. All rights reserved.