のような C STL 関数への安全でない呼び出しを使用して記述されたレガシー コードがあるとしますstrcpy
。strcpy
プログラムがバッファオーバーフローの問題に対して脆弱になるため、安全ではないことは誰もが知っています。strcpy
へのすべての呼び出しを への呼び出しに置き換えたいとしましょうstrncpy
。すべての呼び出しを に置き換える手法には、パラメーターを使用して呼び出してから で終了するstrcpy(dest, src)
ことが含まれます。これに関する問題は、ヒープに割り当てられたメモリへのポインターである可能性があるため、常に長さがわからないことです。strncpy
(dest, src, length of dest - 1)
dest
\0
dest
dest
これらの各呼び出しサイトでの長さを把握できると仮定しましょう。strcpy
へのすべての呼び出しを への呼び出しに置き換えることstrncpy
で、プログラムが (少なくとも の不適切な使用によるstrcpy
) バッファ オーバーフロー攻撃の影響を受けないことが保証されます。ただし、このアプローチでは、データが暗黙のうちに切り捨てられ、プログラムの動作が望ましくない方法で変更される可能性があります。これは、切り捨てを検出してプログラムを中止するよりも優れたアプローチですか? または、切り捨てを許可するだけでなく、ログに記録する方が良いですか?
レガシ コードにパッチを適用するための自動化された方法の開発に関心がある人の観点から質問しています。この問題にどのようにアプローチするのが最善かについて考えている人はいますか?