10

ご存知かもしれませんが、Microsoftはmemcpy()セキュリティ開発ライフサイクルを禁止し、に置き換えましたmemcpy_s()

void *memcpy(void *dest, const void *src, size_t n);

/* simplified signature */
errno_t memcpy_s(void *dst, size_t dstsize, const void *src, size_t n);

したがって、コードが以前は次のようになっていた場合:

if (in_len > dst_len) {
    /* error */
}
memcpy(dst, src, in_len);

あれは。。。になる:

if (memcpy_s(dst, dst_len, src, src_len)) {
    /* error */
}

または、切り捨てを使用して、

memcpy(dst, src, min(in_len, dst_len));

vs

(void)memcpy_s(dst, dst_len, src, src_len);

質問:余分な長さのパラメーターはどのようにしてコードをより安全にするのですか?を使用するmemcpy()には、4つのパラメーターすべてがわかっていて、3番目の引数として適切な長さを渡す必要があります。宛先バッファサイズを誤って計算し、間違った値を渡すという同じ間違いをするのを妨げているのはdst_size何ですか?なぜそれが違うのかmemcpy()、なぜ非推奨になっているのかわかりません。見えない一般的なユースケースはありますか?ここで何が欠けていますか?

4

7 に答える 7

14

「安全な」バージョンでも、パラメータが間違っていることを妨げるものは何もありません。Microsoftは、あなたが常に次のようなものを使用すると考えているようです。

errno_t e = memcpy_s (&dstbuff, sizeof(dstbuff), &srcbuff, sizeof(srcbuff));

エラーを確認してください。

しかし、これは彼らがその言語で何をしているのかわからない人々を助けるだけです。私の意見では、そのグループの人々はその言語を使用すべきではないか、それがどのように正しく機能するかを学ぶべきです。

この種の松葉杖は、コードが移植可能ではないため、長期的には何のメリットもありません。

さて、マイクロソフトが何らかの分析を行った結果、誤用によって引き起こされた多くの問題があり、memcpy()これで問題が解決すると考えた可能性があります。しかし、そうだとすれば、標準のコンパイラでは利用できない非標準の機能を開発者に強制的に使用させるのではなく、開発者を教育する方が良い解決策になると思います。

于 2009-05-18T07:26:52.730 に答える
8

情報の重複は常に悪い設計です。何か問題が発生する可能性が高くなるだけです。Microsoft は、API の設計に関して驚くべき記録を持っており、過去にはドキュメントの卓越性によってのみ救われてきました。安心できるのは、元の memcpy() 関数を削除できないことです。これは ANSI C の一部です。

于 2009-05-18T08:27:13.047 に答える
6

あなたは絶対に正しいです。両方のバッファの長さを追跡している場合は、memcpy を安全に使用できます。そうでない場合、 memcpy_s はあなたを救いません。

于 2009-05-18T07:34:31.253 に答える
4

あなたは何も見逃していません、私はあなたがリンクした記事からのこのスニペットがそれをかなりカバーしていると思います:

何といっても、memcpy_sを使用すると、ターゲットバッファのサイズについて考えることができます。

于 2009-05-18T07:25:17.023 に答える
1

Microsoft によると、これにより、コード品質チェックを書くのが少し簡単になります。プログラマーが両方のサイズ パラメータに同じ値を渡していないことを確認できます (多くの人はおそらく怠惰からそうするでしょう)。もう 1 つのこと (実際にはコード セキュリティとは関係ありません) は、このメソッドを使用してコードを少しクリーンアップできることです。これは、コード内で行うチェックが少なくmemcpy_sなるためです。デスティネーション バッファ、チェックの 1 つを削除します。

最も重要なのは、memcpy_sコピー全体が成功したかどうかを示すエラー コードを返すmemcpyことですが、これを確認する方法はありません。 これmemcpy_sは、マイクロソフトがより安全だと感じているものmemcpyです。

于 2009-05-18T07:38:10.903 に答える
0

Cのようなアセンブリは、自分が何をしているのかを知っている人のためのものです。K&Rからそのようなものを直接読んだことを覚えています。

于 2009-10-25T16:53:48.760 に答える
-1

私は実際に軽蔑することもありますが、マシンが何であるかを見て、ビットをシフトするのが好きな本物のプログラマーは、もはや世界にほとんど残っていません。少し話が逸れてしまいましたが、私は何が起こっているのかを正確に知りたいと思っています。つまり、free() の呼び出しと malloc()/strdup() の呼び出しを一致させるのはどれくらい難しいのでしょうか? memcpy() を安全に呼び出すことができることを知るために、十分なバッファー スペースが割り当てられていることを確認するのはどれくらい難しいのでしょうか? 回答: たいしたことではありませんが、プログラマーの 99.9% は自分が何をしているのか気にしていません。

エンドラン。

于 2009-07-24T11:16:35.830 に答える