■この記事の概要
この記事では、GCCの-fanalyzer
(静的解析)と-fsanitize
(動的解析)の使い分けを解説しています。静的解析はコードの問題をコンパイル時に、動的解析は実行時に検出するツールであり、それぞれの特性と適用例を紹介しています。特に、バグの早期発見と効率的な修正の重要性を強調しています。
■gcc -fanalyzer(静的解析)
貴方の悪癖を指摘してくれる漢方薬のような効果がある。
コンパイル可能なソースコードがあれば良い。
gcc -Wall -Wetra で
不摂生なプログラマのコードに
大量の警告が出る。
職業プログラマは全ての警告を素直に直そう。
後から
ものすごい工数でコードの正当性を
お客に説明するならば
今すぐコードを直そう。
gcc -fanalyzerでは
データフロー解析もしてくれる。
プログラムの流れをgccが読んで怪しい所を
指摘してくれる(古いgccは未サポート)
■gcc -fsanitize(動的解析)
受け入れ試験前日のPM6:00に
セグメンテーションフォールトコアダンプが起きたなら
gcc -fsanitize で再コンパイルできないか検討してください。
貴方のコードの疾患を
今直ぐ治してくれる西洋薬のような効果が期待できるかも。
でも、、、まあ、、
動的解析で貴方のコードの体質が改善されるわけではないので、
日頃から
静的解析でコードを綺麗にしておいてね。
■動的解析で検出できる問題例
void w(char *p,int idx,char c) {
p[idx]=c;
}
char r(char *p,int idx) {
return p[idx];
}
int main(void)
{
char buf[10] = {0};
w(buf,10,r(buf,10));
}
配列の領域外(buf[10])をread/write して
プログラムが異常終了するかもしれない
このコードは
gcc -Wall -Wextra -fanalyzer(静的解析)では問題検出できませんが、
gcc -fsanitize=address(動的解析)で問題検出可能です。
静的解析⇒コンパイル時問題が分る
動的解析⇒走行時問題が分る(ただし問題個所を通過しないとダメ)