整数到指针投悲观优化机会
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 警告
我查了一下,但我想不通。该代码有效,并获得正确的值。我只是担心警告。
如果程序执行如下计算:
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*p
,p
不可能等于 y
如果 (uintptr_t)p
等于 (uintptr_t)(x+10)
而 p
等于 y
。该标准不禁止这样的假设,但它也不会禁止代码永远不会将任何 integer-to-pointer 转换的结果用于除与其他指针比较之外的任何目的的假设。支持类型 uintptr_t
的实现当然应该提供关于 round-tripped 指针的更强有力的保证,这不仅仅是说它们可以与原始指针进行比较,但标准不需要这样的处理。
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
我查了一下,但我想不通。该代码有效,并获得正确的值。我只是担心警告。
如果程序执行如下计算:
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*p
,p
不可能等于 y
如果 (uintptr_t)p
等于 (uintptr_t)(x+10)
而 p
等于 y
。该标准不禁止这样的假设,但它也不会禁止代码永远不会将任何 integer-to-pointer 转换的结果用于除与其他指针比较之外的任何目的的假设。支持类型 uintptr_t
的实现当然应该提供关于 round-tripped 指针的更强有力的保证,这不仅仅是说它们可以与原始指针进行比较,但标准不需要这样的处理。