を使用してメモリを割り当てる場合、malloc()
それを読み取り専用としてマークする方法はありますか。誰かが書き込みを試みると、memcpy() は失敗しますか?
これは、大きなメモリ構造の一部であるメソッドによって返される const ポインターをユーザーが誤って使用しているという、API 設計の欠陥に関係していますGetValue()
。大量のメモリのコピーを回避するため、特定の形式の構造化メモリ内でライブ ポインターを返します。ここで問題となるのは、一部のユーザーが、このメモリに直接書き込み、割り当てを行う SetValue() 呼び出しを回避し、当社が開発したメモリ バイナリ形式で適切に渡すことで、自分のものを動作させるためのハックを見つけることです。このハックは機能する場合もありますが、ユーザーによってオーバーライドされた制御フラグの誤った解釈が原因で、メモリ アクセス違反が発生する場合もあります。
ユーザーを教育することも 1 つのタスクですが、ここではコードを失敗させたいとします。
このケースに対して単純に防御できるかどうかが疑問です。
例として、誰かが sqlite ステートメントから blob 列を取得し、それに書き戻すと仮定します。sqlite の場合は意味がありませんが、この場合は多少起こっています。
ベストアンサー1
ほとんどのハードウェアアーキテクチャでは、保護属性は全体のみ変更できます。メモリページ; ページのフラグメントを読み取り専用としてマークすることはできません。
関連する API は次のとおりです。
mprotect()
Unix の場合;VirtualProtect()
Windows の場合。
メモリ ページに、読み取り専用にしたくないものが含まれていないことを確認する必要があります。これを行うには、 で過剰割り当てするか、 、、 などmalloc()
の別の割り当て API を使用する必要があります。mmap()
posix_memalign()
VirtualAlloc()