web-dev-qa-db-ja.com

addressSanitizer:アドレスのヒープバッファオーバーフロー

私はCの学習を始めたばかりです。

ファイルを開くための関数を書き、BUFFER_SIZE、コンテンツを配列に保存してから、文字'\n'(入力の各行を取得するため)。

BUFFER_SIZE非常に大きく、最初の行を取得できます。 BUFFER_SIZE合理的に小さい(42など)まだ最初の行の終わりではありませんが、最後に奇妙なシンボルを出力しますが、私自身のコードのバグだと思います。

ただし、BUFFER_SIZE非常に小さく、たとえば= 10で、-fsanitizer=addressメモリリークをチェックします。エラーのモンスターを投げます:

==90673==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000fb at pc 0x000108868a95 bp 0x7fff573979a0 sp 0x7fff57397998
READ of size 1 at 0x6020000000fb thread T0

誰かが私を一般的な意味で説明できる場合:

  • fsanitizer = addressフラグとは何ですか?

  • ヒープバッファオーバーフローとは何ですか?

  • アドレスとスレッドとは何ですか?画面上にスレッドを色で表示するフラグは何ですか?

  • そして、なぜそれは「アドレスでサイズ1の読み取り..」と言うのですか?

私は本当に感謝します<3

7
Linh Chi Nguyen

fsanitizer = addressフラグとは何ですか?

通常、Cコンパイラはメモリアクセスの境界チェックを追加しません。コードエラーが原因で、バッファの外部から読み取りまたは書き込みが行われる場合がありますが、このようなエラーは通常検出が困難です。このフラグを使用すると、コンパイラは境界チェックを追加し、バッファを使用して割り当て外に到達しないようにします。

ヒープバッファオーバーフローとは何ですか?

割り当て後に到達するために配列を使用し、

char* x = malloc(10);
char n=x[11]; //heap-buffer-overflow

(アンダーフローは割り当て前に到達することです)

char* x = malloc(10);
char n=x[-11]; //heap-buffer-underflow

アドレスとスレッドとは何ですか?

アドレスはメモリ内の位置であり、スレッドは一連のコードを実行するプロセスの一部です。

そして、なぜそれは「アドレスでサイズ1の読み取り..」と言うのですか?

これは、指定されたアドレスから1バイトを読み取ることを意味します。


あなたの問題は、BUFFER_SIZEバッファに対して、同じBUFFER_SIZEに。正しいアプローチは、常にあなたが読むよりも少なくとも1バイト多く宣言することです。このような:

char* buff = malloc(BUFFER_SIZE+1);//notice to +1
fread(buff,1,BUFFER_SIZE,fp);
6
SHR