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; /* May produce a warning diagnostic */ ipp = (int**) &ip; /* May produce a warning diagnostic */ *ipp = &i; /* Valid */ if (*ip != 0) { /* ip is defined as non-volative but it contains the lvalue of a volative int */ /* ...*/ } }
8 行目と 9 行目で違反が報告されます。