如何解决此MISRA警告:C
How to resolve this MISRA warning: C++
这是以下代码:
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抱怨将输出流设置为十六进制格式的惯用方式真是太糟糕了。
首先,您所显示的代码对我来说很标准。
我看到了一些可能的解释和方法来解决警告:
-
流操作器
std::hex
实现了MISRA-符合形式。a)不要使用
std::hex
。b)修复
std::hex
。尝试在环境中查找std::hex
的实现。 -
包括std :: hex在内的代码是一致的,但警告是错误的。
a)忽略或抑制警告。
b)向编译器或代码验证器的供应商提出错误报告。
您确实有三个选择:
- 请勿使用
std::hex
- 做
cout<<&std::hex
- 从Misra标准提出偏差请求
第一个选项可能不实用,第二个选择是奇怪的。
幸运的是,米斯拉的标准期望不遵循这些规则 - 从米斯拉·c标准(这是我唯一要交给的文字)
)严格遵守所有规则是不太可能的,实际上,与个人情况相关的偏差是可以接受的。
当然,这并不意味着您可以做自己想做的,而是标准期望偏差请求将提交 - 这是如何完成的,您的QMS应该覆盖它。就您的工具而言,可能有一个可以忽略的选择。
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板
- MISRA 警告<复杂表达式隐式转换为不同的基本类型>
- 如何解决此MISRA警告:C
- Misra C 2008奇怪的警告
- 如何解决这个符合MISRA C 的警告
- 警告634和警告613:Misra