整数到指针投悲观优化机会

Integer to pointer cast pessimism optimization opportunities

from_base函数returns从base到selected的内存地址 程序中的值。我想在一个函数中检索这个值和 return 它,但是,我收到一条警告说 integer to pointer cast pessimism optimization opportunities.

DWORD chat::client() {
    return *reinterpret_cast<DWORD*>(core::from_base(offsets::chat::client));
}

我在从程序转换函数时也收到此警告:

auto og_print = reinterpret_cast<chat::fn_print_chat>(core::from_base(offsets::chat::print));

我不明白为什么我会收到有关 integer to pointer cast pessimism optimization opportunities

的 clang-tidy 警告

performance-no-int-to-ptr

我查了一下,但我想不通。该代码有效,并获得正确的值。我只是担心警告。

如果程序执行如下计算:

char x[10],y[10];
int test(ptrdiff_t i)
{
  int *p = x+i;
  *p = 1;
  y[1] = 2;
  return *p;
}

编译器可以合理地假设因为 p 是通过使用 x 的指针算法形成的,它不可能等于 y+1,因此函数总是 return 1. 但是,如果代码写成:

char x[10],y[10];
int test(ptrdiff_t i)
{
  int *p = (char*)((uintptr_t)x + i);
  *p = 1;
  y[1] = 2;
  return *p;
}

那么这样的假设就不那么合理了,因为无符号数字语义会将 uintptr_t z = (uintptr_t)(y+1)-(uintptr_t)x 的行为定义为产生一个值,使得 x+z 等于 (uintptr_t)(y+1)

我发现 clang 在这里表现出的明显警告有点令人惊讶,因为 clang 倾向于假设,给定一些指针 char*pp 不可能等于 y 如果 (uintptr_t)p 等于 (uintptr_t)(x+10)p 等于 y。该标准不禁止这样的假设,但它也不会禁止代码永远不会将任何 integer-to-pointer 转换的结果用于除与其他指针比较之外的任何目的的假设。支持类型 uintptr_t 的实现当然应该提供关于 round-tripped 指针的更强有力的保证,这不仅仅是说它们可以与原始指针进行比较,但标准不需要这样的处理。