コーディングとはバグを消すという作業という側面があるのも事実である。
バグを消す作業はとても重要である。
まずはバグをチェックする際の用語と、その対策を整理してみる
用語解説
セグフォ
ソフトウェアがアクセス禁止とされているメモリ上のエリアにアクセスしようとしたり、メモリ上の位置ごとに設定されているルールに違反してメモリにアクセスしようとするときに起こるものである
メモリリーク
malloc( )で動的に確保されたメモリ領域は,それに対応するfree( )の呼び出しで適切に解放されなければならない。アプリケーションプログラムが動的に確保したメモリ領域の解放を忘れていると,そのメモリ領域は誰にも使用されることなく,プログラムが終了するまでシステムのメモリ資源を無駄に占有し続けることになる。
対策/手法
gcc -g -fsanitize=address
セグフォが起きたさいにコンパイルすると箇所を教えてくれる。
これを用いる事により、配列外アクセス、開放済み領域へのアクセス、使用中領域への書き込み等が実行時に検出できるようになります。またソースの静的解析も行えます。
リークが起きているかどうか
top
コマンドでメモリの使用量が小さく
memory の欄が増えていなければリークなし。
バグチェック
printf(/s s)
printf (/p p) malloc を確保する場合に有効
セグフォ
配列や変数の初期化
配列の境界を越えない
メモリ領域を確保する →ヒープ領域で動作するか?
形安全でないキャストに注意する。
nullポインタ脱参照化
ライブラリ関数の誤使用
gcc -g -fsanitize=address -
-g をつけると行数まで教えてくれる。
セグフォが起きたさいにコンパイルすると箇所を教えてくれる。
リークチェック
main関数の一番最後に
system("leaks a.out");
utility の関数もチェック。
result の値でヌル終端をつける。
vscodeにおけるデバッグのファイルの配置
setting とlaunch の直下にファイルを配置するとデバッグ走る。
vargrind
malloc で確保された領域は仮装メモリ上に配置されているので、free するとそこを指す領域がなくっなってしまう
str = malloc"a"
free(str);
str2 = str;
は成り立たない。
から文字、NULL、の違いを明確にする。
makefile を作っておく。
下記参照サイトである。
https://daeudaeu.com/vscose_debug_c/
https://monozukuri-c.com/langc-funclist-debug1/
https://mattyan1053.hatenablog.com/entry/2018/12/08/155228
https://daeudaeu.com/vscose_debug_c/
https://monozukuri-c.com/langc-funclist-debug1/
https://mattyan1053.hatenablog.com/entry/2018/12/08/155228
task jsonはコンパイルするまでのファイルの互換性を指し示すファイル。
launch json はデバック時に必要となってくる構成ファイルである。