1

バックグラウンド

次のコードを検討してください。

    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 が何を伝えようとしているのかを理解したいと思っています。

4

1 に答える 1