CERT.EXPR.VOLATILE.ADDR

非 volatile ポインターを介して volatile オブジェクトにアクセスしないでください。

脆弱性とリスク

非 volatile lvalue による volatile 修飾された型の参照は、定義されていない動作です。

たとえば、コンパイラは一度テストされた変数が変化できないと判断すると、最適化中に重要なコードを削除する場合があります。

このチェッカーは、volatile オブジェクトのアドレスを非 volatile ポインター (*) に代入するコードを探します。

軽減と防止

volatile オブジェクトを指すポインターに "volatile" 修飾子を使用してください。

コピー
void func(void) {
     static int *ip1;
     static volatile int i_v = 0;
     ip1 = &i_v;
    if (*ipl != 0) { /* ip が 非 volatile として定義されていますが、これに volatile int の lvalue が含まれています */
      /* ...*/
    }
  }

4 行目で違反が報告されます。