次の例では:
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++ でプログラミングできるのはどうしてでしょうか? 標準では、どのようにポインタ変換を行う必要があるかについては述べていません。
私の製品コードでは、事前定義されたデータ構造のファイルからread with 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によるとどうすればいいのですか?
それで、何か解決策はありますか?
編集: Peter と QQ の回答はどちらも正しいです。プロジェクトが最終段階にある場合、MISRA は実際にキャストなしですべてを実行したいと考えているようです。次の 2 つのオプションがあります。
1 - MISRA の逸脱を 1 つずつ文書化し、キャストが OK である理由を説明し、これがどのようにテストされたかを説明します (QQ の提案)
2 - file.read() に char 型のバイト配列を使用し、ファイルの内容を安全に読み取った後、バイト配列をヘッダーの内容にキャストします。char* を int32_t にキャストすると、これをメンバーごとに 1 つずつ行う必要があります。再びルール 5-2-7 違反です。時にはそれはあまりにも多くの仕事です。