any
バッファに対するいかなる種類の操作も範囲外アクセスにつながることがないように、文字バッファにサイズ制約を課す方法はありますか?
4 に答える
要するに:いいえ
手作業で行わない限り、Cはランタイムチェックを実行しません。
独自の関数、マクロ、およびバッファごとの簿記を使用して、無効なアクセスを防ぐことができます。ただし、このインターフェイスはどこでも使用する必要があります。つまり、そのバッファに直接アクセスできなくなります。
また、追加の条件チェックによるパフォーマンスへの影響も確認できます。範囲外アクセスを引き起こさないことが証明されているコードブランチへの直接アクセスを使用することで、その一部を回避できる可能性があります。
編集:
「無効なアクセスが検出されたら、コードは何をすべきか」というかなり大きな問題もあります。プログラムは、他の言語で例外が発生したかのように、エラーを出力して終了する必要がありますか?エラーを無視する必要がありますか?それを修正しようとすべきですか?
この問題に対処するCの方法は、各アクセスをチェックするのではなく、飛躍する前に見て、各コードブランチ/パーツが安全であることを事前に確認することです。
これは役立つかもしれません:あなたの探求においてhttp://duma.sourceforge.net/ 。
簡単な答え:いいえ。
長い答え:範囲外にならない
ようなばかげたものでも確実buffer[ULLONG_MAX]
にするには、システムで表現可能な最大の整数よりも大きい範囲でバッファーを宣言する必要があります。このようなバッファが必要とするメモリの量を除けば、これは明らかに不可能です。
実用的な解決策は、バッファのサイズを手動で追跡し、バッファへの信頼できないインデックスがバッファサイズに対して検証されることです。
デバッグ支援として使用されるメモリ安全チェッカーを参照してください。これは、Cコードを計測して、配列またはバッファーでエラーが発生したかどうかを判別します。これにより、valgrindでは不可能な問題が見つかります。