【C言語】gccの
-fanalyzer(静的解析)と
-fsanitize(動的解析)

■この記事の概要

この記事では、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(動的解析)で問題検出可能です。

静的解析⇒コンパイル時問題が分る
動的解析⇒走行時問題が分る(ただし問題個所を通過しないとダメ)