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

时间:2014-01-30 08:07:43

标签: c++ misra

以下代码如下:

  std::stringstream os;

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

警告:“必需规则8-4-4,功能标识符不使用'&amp;'或括号参数列表“

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

7 个答案:

答案 0 :(得分:5)

执行警告所说的内容:获取函数的地址:

os << &std::hex;

答案 1 :(得分:4)

如何使用&之类的建议?

#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;
}

是的,it works too


有什么区别?

  • std::hex参考以实现
  • &std::hex指针的功能

由于对函数的引用具有到函数指针的隐式转换,因此您可以将其传递给ostream,它将按预期工作。但显然,MISRA要求你明确表示你是否想要我想要函数我想要调用函数

答案 2 :(得分:2)

你可以做到

std::hex(std::cout);

相当于

std::cout << std::hex;

哪个会摆脱警告。或者,使用

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

但这看起来很难看,虽然这是正确的。

底线是,MISRA在这里是错误的&#34; /尴尬/意外。 std::hex可以像你一样使用,没有任何问题。

答案 3 :(得分:1)

该行

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抱怨将输出流设置为十六进制格式的惯用方法太糟糕了。

答案 4 :(得分:1)

也许这是主题,但通常使用std :: stringstream和stream。它有一个状态,默认情况下它不会抛出。因此,在内存不足的情况下,它只是设置一个“错误”标志,而不是抛出std :: bas_alloc,这可能是非常棘手的错误和崩溃的来源。

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

答案 5 :(得分:0)

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

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

  1. 流操作符std::hex是符合MISRA标准的。

    a)不要使用std::hex

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

  2. 包含std :: hex的代码符合,但警告是错误的。

    a)忽略或取消警告。

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

答案 6 :(得分:0)

你真的有三个选择:

  1. 请勿使用std::hex
  2. 执行cout<<&std::hex
  3. 从MISRA标准
  4. 提出偏离请求

    第一个选项可能不实用,第二个选项是icky。

    幸运的是,MISRA标准期望不会盲目遵循规则 - 从MISRA C标准(这是我唯一可以提供的文本)

      

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

    这并不意味着你可以做你想做的事情,相反,标准期望提交偏差请求 - 如何做到这一点是本地问题,以及你的质量管理体系应该覆盖它。就您的工具而言,可能存在基于每次出现而忽略的选项。