次の方法で共有


C6268

警告 C6268: 操作の順序が不適切です: (<TYPE1>)(<TYPE2>)x + y です。(<TYPE1>)((<TYPE2>)x + y) にかっこが不足している可能性があります

この警告は、複雑なキャスト式でポインター演算を実行するときに優先順位に関する問題が発生することを示します。キャストでは二項演算子よりも密接にグループ化されるため、プログラマが意図したとおりの結果が得られない可能性があります。場合によっては、この問題によって不適切な動作やプログラムのクラッシュが発生します。

次のような式があるとします。

(char *)p + offset

この場合、オフセットは文字単位のオフセットとして解釈されます。しかし、次のような式ではどうでしょうか。

(int *)(char *)p + offset

上の式は、下の式と同等です。

((int *)(char *)p) + offset

この場合、オフセットは整数単位のオフセットとして解釈されます。つまり、次の式と同等になります。

(int *)((char *)p + (offset * sizeof(int)))

これは、プログラマの意図とは異なります。

2 つの型の相対的なサイズによっては、バッファー オーバーランの原因になります。

使用例

この警告が発生するコード例を次に示します。

void f(int *p, int offset_in_bytes)
{
    int *ptr;
    ptr = (int *)(char *)p + offset_in_bytes;
    // code ...
}

この警告を解決するには、次のコードを使用します。

void f(int *p, int offset_in_bytes)
{
    int *ptr;
    ptr = (int *)((char *)p + offset_in_bytes);
    // code ...
}