2014-01-30 103 views
4

这是因为下面的代码:如何解决这个MISRA警告:C++

std::stringstream os; 

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

警告:

“必需规则8-4-4,功能标识不 '&' 或parenthisized参数列表中使用”

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

+0

warning is for line os << std :: hex; – suhel

+0

应该“加上括号”,提交错误报告;) –

+0

什么是产生这个警告?这将有助于极大地澄清这个问题。 – Xofo

回答

0

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

我看到一些可能的解释以及如何解决相应的警告:

  1. 操纵std::hex实现MISRA-符合的流。 a)请不要使用std::hex

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

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

    a)忽略或取消警告。

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

+2

你的可能性,1a是最好的。 MISRA规则是短视的,并且使得ISO C++标准std :: hex不符合。你不能修复它,ISO不会修复它。正确的解决办法是MISRA修正这个规则。但要考虑1a,同时最好的解决方案不是很现实。 – MSalters

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要求你明确你的意思是我想要功能我想调用功能

5

执行警告说什么:取函数的地址:

os << &std::hex; 
2

你可以做

std::hex(std::cout); 

这相当于

std::cout << std::hex; 

这将摆脱警告。或者,使用

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

但这看起来确实很丑,虽然它是正确的。底线是,MISRA在这里是“错误的”/尴尬的/意外的。可以像你一样使用std::hex,没有任何问题。

+0

如果不知道*理由*,我不会说错。 MISRA并不仅仅是防止未定义/未指定/实现定义的行为。它还发布了“风格”指南,这可能就是其中之一......或者OP可能通过疏忽引发了MISRA-C指南。 –

+2

@MatthieuM。那么好的规则通常会有更好的例外。我会说使用流操纵器而不考虑他们的地址是一个 - 这是正常的。看到'&'实际上会让我去“wtf?”。当然,一些MISRA的倡导者说它的目的实际上是让你去“wtf”,然后仔细检查代码是否正确。 – Angew

+0

@MatthieuM。真的够了。但仍然尴尬。稍微修改了我的答案。 – rubenvb

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

1

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

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

0

你真的有三种选择:

  1. 不要使用std::hex
  2. cout<<&std::hex
  3. 从MISRA标准提高一个偏差申请

第一种选择可能不实际,第二种选择是icky。

幸运的是,MISRA标准预计的规则不会亦步亦趋地跟随 - 从MISRA C标准(这是唯一一个我有文字手)

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

这并不当然意味着你可以做你想做的,而是标准的期望一个偏差申请将提交 - 如何做到这一点是本地的事情,和你的QMS应该覆盖它。就您的工具而言,可能会有一个选项可以忽略每个事件。