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