C6268
Aviso C6268: Ordem incorreta de operações: (<TYPE1>)(<TYPE2>)x + y.Parênteses ausentes possíveis em (<TYPE1>)((<TYPE2>)x + y)
Esse aviso indica que uma expressão complexa convertido pode envolver um problema de precedência ao executar a aritmética do ponteiro.Como as conversões se agrupam mais perto de operadores binários, o resultado pode não ser o que o programador pretendeu.Em alguns casos, esse defeito causa o comportamento incorreto ou falha de programa.
Em uma expressão como:
(char *)p + offset
o deslocamento é interpretado como um deslocamento em caracteres; entretanto, uma expressão como:
(int *)(char *)p + offset
é equivalente a:
((int *)(char *)p) + offset
e o deslocamento é interpretado bem como um deslocamento em inteiros.Em outras palavras é equivalente a:
(int *)((char *)p + (offset * sizeof(int)))
é provável que não ser o que o programador pretendeu.
Dependendo dos tamanhos relativos dos dois tipos, isso pode levar a uma excesso de buffer.
Exemplo
O código a seguir gera este aviso:
void f(int *p, int offset_in_bytes)
{
int *ptr;
ptr = (int *)(char *)p + offset_in_bytes;
// code ...
}
Para corrigir esse aviso, use o seguinte código:
void f(int *p, int offset_in_bytes)
{
int *ptr;
ptr = (int *)((char *)p + offset_in_bytes);
// code ...
}