C6268

更新:2007 年 11 月

警告 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)))

这不太可能是程序员的意图。

这可能导致缓冲区溢出,具体取决于两种类型的相对大小。

示例

下面的代码生成此警告:

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 ...
}