私は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
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);