バックグラウンド
次のコードを検討してください。
template <typename T>
void WriteData(const size_t &offset, const T &data)
{
if(sizeof(data) <= 8) //if size is 64bits or less, memcpy is not as efficient as a direct write
*reinterpret_cast<T*>(reinterpret_cast<char*>(_memView) + offset) = data;
else
{
errno_t result = memcpy_s(reinterpret_cast<char*>(_memView) + offset, SHARED_BUFFER_SIZE - offset, &data, sizeof(data));
if(result != 0)
throw exception("Error writing data");
}
}
_memView が void ポインターとして宣言されているとします。memcpy_s はどこにも再定義されていません。
この関数は、char、int、HANDLE、unsigned int、long、および unsigned long の型でのみインスタンス化されます。このスニペットの他の問題にとらわれないでください。これは klocwork に関するものです。
このテンプレート化されたコードはクラスの一部であるため、これはヘッダー ファイルにあります。
他の関連情報が不足している場合は、お問い合わせください。
問題
Klocwork で分析した後、次の SV.BANNED.COPY 警告が表示されます。
つまり、memcpy_s を呼び出している方法で、ここで頭がおかしいことをしているのですか? memcpy_s は Klocwork によって安全でないと見なされますか? Klocwork は char* へのキャストによって混乱し、C スタイルの文字列を操作していると思いますか?
Klocwork が何を伝えようとしているのかを理解したいと思っています。