CERT.EXPR.VOLATILE.PTRPTR

ポインターを指す volatile ポインターへの非 volatile ポインターに参照を代入しないでください。

脆弱性とリスク

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

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

このチェッカーは、ポインターを指す volatile ポインター (**) への非 volatile ポインターのアドレスを割り当てるコードを探します。この結果、volatile オブジェクトの lvalue を非 volatile ポインターに保存できる可能性があります。

軽減と防止

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

コピー
  void func(void) {
    static volatile int **ipp;
    static int *ip;
    static volatile int i = 0;
   
    printf("i = %d.\n", i);
   
    ipp = &ip; /* 警告診断を生成する可能性があります */
    ipp = (int**) &ip; /* 警告診断を生成する可能性があります */
    *ipp = &i; /* Valid */
    if (*ip != 0) { /* ip が 非 volatile として定義されていますが、これに volatile int の lvalue が含まれます */
      /* ...*/
    }
}

8 行目と 9 行目で違反が報告されます。