❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

バグチェックの手法、デバッグ/セグフォ/リーク

コーディングとはバグを消すという作業という側面があるのも事実である。
バグを消す作業はとても重要である。
まずはバグをチェックする際の用語と、その対策を整理してみる


用語解説

セグフォ

ソフトウェアがアクセス禁止とされているメモリ上のエリアにアクセスしようとしたり、メモリ上の位置ごとに設定されているルールに違反してメモリにアクセスしようとするときに起こるものである

メモリリーク
malloc( )で動的に確保されたメモリ領域は,それに対応するfree( )の呼び出しで適切に解放されなければならない。アプリケーションプログラムが動的に確保したメモリ領域の解放を忘れていると,そのメモリ領域は誰にも使用されることなく,プログラムが終了するまでシステムのメモリ資源を無駄に占有し続けることになる。


対策/手法
gcc -g -fsanitize=address
セグフォが起きたさいにコンパイルすると箇所を教えてくれる。
これを用いる事により、配列外アクセス、開放済み領域へのアクセス、使用中領域への書き込み等が実行時に検出できるようになります。またソースの静的解析も行えます。

リークが起きているかどうか

system("leaks a.out");
stdlibをインクルードする必要がある。


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 はデバック時に必要となってくる構成ファイルである。