質問
最近、私は、彼 記事 る請求項マイクロソフトが禁止に memcpy()
機能はその確保ングのお店です。私の理解では、脆弱性の固有の機能が必要で禁止し、その使用を完全に?
べきプログラムを書いているのを避ける memcpy()
完全に、確実で安全に使用?どの選択肢が存在しを提供する同様のものより安全なfunctionalilty?
解決
Microsoftの提供 選択肢 にmemcpyとwmemcpyることを実証します。
memcpy_s、"Hmmを用いた前に、私からの読み込みアドレス、検証のために自分自身ではありませんのでnullポインター;以前書いている私は、当該提案を可決する旨の理する試験です。私はまた、数バイトをしていま求められたときはコピーを請求項に係るサイズの先;場合にだけ、そのすべてのこれらの試験を行うにしてコピーします。
memcpy"ともに先への登録、ものの、ソースへの登録、もカウントへの登録を行MOVSBはMOVSW." (例geocities、長くこの世界: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)
編集:たとえば、野生の ご希望のが私のコマンド アプローチをmemcpy、OpenSolaris、memcpyです(一部の構成) で定義されbcopy, は、 bcopy (一部の構成)が---
void
33 bcopy(from, to, count)
34 #ifdef vax
35 unsigned char *from, *to;
36 int count;
37 {
38
39 asm(" movc3 12(ap),*4(ap),*8(ap)");
40 }
41 #else
42 #ifdef u3b /* movblkb only works with register args */
43 unsigned char *from, *to;
44 int count;
45 {
46 asm(" movblkb %r6, %r8, %r7");
47 }
48 #else
49 unsigned char *from, *to;
50 int count;
51 {
52 while ((count--) > 0)
53 *to++ = *from++;
54 }
55 #endif
編集:おかげさミリー-スミス!こうしたgeocitiesのページでリンク先:
MOVS
指示movs使ってコピーした文字列の先にあるか、コピー、移動しない).この指示には二つのバリエーション:movsbとmovsw.のmovsb("移動文字列のバイト")が一つのバイト時にはmovsw動バイトです。
ていない複数のバイト時に、これらのmovs指示を用いて行うバッチを使用rep接頭辞です。数の動きをタイムリーかつ詳細に指定するCXするものとする。例を参照してください。
:
lds si, [src]
les di, [dest]
cld
mov cx, 100
rep movsb
:
この例では、コピーを100バイトからのsrcをdest.置換する場合はmovsbとmovsw、コピーで200バイトです。削除されたり、rep prefix、CX登録しても、何も行われません。移動になります一つのバイトがでmovsb、または2バイトの場合はmovsw).
他のヒント
チェーンソーは、適切に使用すれば、安全です。 memcpyのと同じこと()。あなたは釘を打つ場合でも、両方のケースでは、それが飛ぶと、あなたを傷つけることができます。
要するに、memcpyを()低レベルのコンピューティングに必要であり、離れて行くことはありませんが、高レベルのプログラミングのためにあなたがそれを必要としません。 Pythonで何のmemcpy()はありません。
気にしないでください。 Microsoftの選択肢はそれほど良くありません。主な値は、これらがあなたのコードは、Linuxへの移植不可能になる場合があることです。 Microsoftは、彼らはあなたが買っ++のVisual Cのコピーで作っているよりも、彼らはあなたの顧客に販売するOS上でより多くのお金を作ってます。
記事自体は安全な代替を説明しています。その数は、コピーするバイトの量とは独立して設けられている場合は、バッファオーバーフローを防止するためのバリアとして作用します。もちろん、あなたが両方に同じ番号を与えることによって、それを乱用することができます。
は私より安全か、単により互換性のない優れたプログラマと私のアプリケーションを作る私のコードでのmemcpy()を禁止されていますか? MSは本当に何を変えるか、単に他のコンパイラとの互換性のない新たなCのコードを作成したい場合、私は、不確実です。ところで。 MSは、多くの機能で、このトリックを行い、それは非常に迷惑なんです。 strcpyの - > strcpy_s - > StringCchCopy
。私はCが自分の足を撮影するためにプログラマにオプションを残すべきだと思います。 適切に行われれば、手動メモリ管理が安全です。
あなた自身がこう言いました:「マイクロソフトは memcpy() 関数を禁止しています。 セキュアプログラミングショップ, 、わかりました 機能に内在する脆弱性,"
memcpy() やその他の多数の標準関数は脆弱性を引き起こすことが知られていますが、(たとえ段階的とはいえ) 改善が些細なものであるにもかかわらず、なぜ安全なプログラミング ショップがそれらの使用を許可するのでしょうか?
自社製品のセキュリティを向上させる取り組みに疑いの余地はなく、コード レビューでは、これらの関数が脆弱性やバッファ オーバーフローなどの大部分の原因となっていることが明確に示されました。彼らは内部使用のみを目的としたラッパーを作成するのではなく、それを標準ライブラリに導入し、全員の利益のためにコンパイラ警告 (禁止ではありません) を追加しました。
あなたは安全なCライブラリがインストールされていない限り、あなたは、memcpy_sを使用することはできません。C99やC ++ 98、など、またはSolaris上の旧バージョンを使用している場合
memcpy_s()独自の規格ごとに、前C11のANSI、を含む非MSの実装、上に存在しないMicrosoft固有の実装である。
それは無関係ですので、私は、脇プロ-MSおよび抗MSのものを残しておきます。
MEMMOVE()は、それがオーバーラップ問題に対処とにかく以来、優れたソリューションです。 memmove_s()あなたはC11以降にしている場合にのみ、再度、より堅牢ですが、。
の代替は memcpy_s を呼び出すことです
あなたは()の代わりにmemcpy_sを使用することになっています。 _sバージョンの同じ種類は安全でないと考え他の様々な機能のために存在する。