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)))
这不太可能是程序员的意图。
这可能导致缓冲区溢出,具体取决于两种类型的相对大小。
示例
下面的代码生成此警告:
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 ...
}