这是因为下面的代码:如何解决这个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参数列表中使用”我无法解决此问题,请提出解决方案。
这是因为下面的代码:如何解决这个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参数列表中使用”我无法解决此问题,请提出解决方案。
首先,您显示的代码对我来说看起来相当标准。
我看到一些可能的解释以及如何解决相应的警告:
操纵std::hex
实现MISRA-符合的流。 a)请不要使用std::hex
。
b)修复std::hex
。尝试在您的环境中查找std::hex
的实施。
包含std :: hex的代码是一致的,但警告是错误的。
a)忽略或取消警告。
b)向您的编译器或代码验证器的供应商提交错误报告。
你的可能性,1a是最好的。 MISRA规则是短视的,并且使得ISO C++标准std :: hex不符合。你不能修复它,ISO不会修复它。正确的解决办法是MISRA修正这个规则。但要考虑1a,同时最好的解决方案不是很现实。 – MSalters
刚刚使用&
如何建议?
#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要求你明确你的意思是我想要功能或我想调用功能。
执行警告说什么:取函数的地址:
os << &std::hex;
你可以做
std::hex(std::cout);
这相当于
std::cout << std::hex;
这将摆脱警告。或者,使用
std::cout << &std::hex;
但这看起来确实很丑,虽然它是正确的。底线是,MISRA在这里是“错误的”/尴尬的/意外的。可以像你一样使用std::hex
,没有任何问题。
线
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抱怨输出流设置为十六进制格式的惯用方式。
也许这是主题,但一般使用std :: stringstream和流的东西。它有一个状态,默认情况下它不会抛出。所以,如果内存不足,它只是设置一个“错误”标志而不是抛出std :: bas_alloc,这可能是非常棘手的错误和崩溃的来源。
你真的有三种选择:
std::hex
cout<<&std::hex
第一种选择可能不实际,第二种选择是icky。
幸运的是,MISRA标准预计的规则不会亦步亦趋地跟随 - 从MISRA C标准(这是唯一一个我有文字手)
严格遵守所有的规则是不可能的并且在实践中与个别情况有关的偏差是可以接受的。
这并不当然意味着你可以做你想做的,而是标准的期望一个偏差申请将提交 - 如何做到这一点是本地的事情,和你的QMS应该覆盖它。就您的工具而言,可能会有一个选项可以忽略每个事件。
warning is for line os << std :: hex; – suhel
应该“加上括号”,提交错误报告;) –
什么是产生这个警告?这将有助于极大地澄清这个问题。 – Xofo