在以下示例中:
bool bad_function()
{
char_t * ptr = 0;
// MISRA doesn't complains here, it allows cast of char* to void* pointer
void* p2 = ptr;
// the following 2 MISRA violations are reported in each of the casts bellow (two per code line)
// (1) Event misra_violation: [Required] MISRA C++-2008 Rule 5-2-7 violation: An object with pointer type shall not be converted to an unrelated pointer type, either directly or indirectly
// (1) Event misra_violation: [Required] MISRA C++-2008 Rule 5-2-8 violation: An object with integer type or pointer to void type shall not be converted to an object with pointer type
ptr = (char_t*) (p2);
ptr = static_cast<char_t*> (p2);
ptr = reinterpret_cast<char_t*> (p2);
return true;
}
报告了 MISRA 5-2-8 和 5-2-7 违规行为。
我怎样才能消除这种违规行为?
我需要有 C++ 静态分析经验的人来帮助我。几天以来,我一直在用这种愚蠢的规则打我的头。
根据 MISRA C++ 标准(MISRA-Cpp-2008.pdf: 规则 5-2-7(必需):具有指针类型的对象不得直接或间接转换为不相关的指针类型。
好的,但是我们有很多代码,例如需要将地址转换为char*
然后与它一起使用std::ifstream
,该read(char* buffer, int length)
函数需要将地址类型转换为 ( char_t*
)。那么根据 MISRA 人的说法,有人可以用 C++ 编程而不使用任何演员表吗?标准没有说必须如何进行指针转换。
在我的生产代码中,我的问题在于使用从预定义数据结构中的文件读取std:ifstream的文件读取操作:
if (file.read((char_t*)&info, (int32_t)sizeof(INFO)).gcount() != (int32_t)sizeof(INFO)
{
LOG("ERROR: Couldn't read the file info header\n");
res = GENERAL_FAILURE;
}
根据 MISRA 应该怎么做?
那么有什么解决方案吗?
编辑:彼得和 QQ 的答案都是正确的,似乎 MISRA 真的想在没有任何演员表的情况下做所有事情,如果项目处于最后阶段,这很难做到。有两种选择:
1 - 逐一记录 MISRA 偏差并解释为什么演员表是好的,解释这是如何测试的(QQ 建议)
2 - 使用 char 类型的字节数组作为 file.read(),然后在安全读取文件内容后将字节数组转换为标题内容,这必须为每个成员一一完成,因为如果您将 char* 转换为 int32_t 这再次违反规则 5-2-7。有时工作量太大。