() 语句之外的指针
Pointers outside of () statement
我不明白循环内部发生了什么
char var_64;
char var_24;
int32_t r0_6 = 0;
do
{
*(&var_24 + r0_6) = *(&var_64 + r0_6);
r0_6 = r0_6 + 1;
}
while (r0_6 != 8);
我无法得到这部分:
*(&var_24 + r0_6) = *(&var_64 + r0_6);
是不是把var_24的地址加1,把var_64的地址加1赋给它?
指针 * 在这里做什么?
编辑:
这是来自另一个反编译器的相同反编译代码:
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
这里我觉得是一样的,只是把v29显示为一个数组
截至目前,代码调用 undefined behavior,因为您正在尝试使用变量 r0_6
,其中
- 有自动存储和。未初始化。
- 地址没有被占用
- 可以有陷阱表示。
然后,在稍后的某个时间点,一旦您初始化 r0_6
的值,您实际上是在尝试取消引用内存位置 *(&var_64 + r0_6)
,[当 r0_6
是除 0] 以外的任何值,这是无效的,它再次调用 undefined behavior.
简而言之,代码毫无意义。
也就是说,一般来说,语法
*(pointer -or- address)
表示indirection or dereference,即取消引用该内存位置以到达该位置的值。
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
由于这是反编译代码,我假设原始代码可能如下所示:
{
char v29[16];
int8_t v39[8];
memset(&v39, 0, sizeof (v39));
memset(v29, 0, sizeof(v29));
for(int i = 0; i < sizeof(v39); i++)
{
((char *)(&v39))[i] = v29[i];
}
}
这意味着你有一个二进制字节数组,转换为二进制值,忽略机器字节顺序,所以这可能只是代码的一部分,或者数组已经是正确的字节订单。
v10 未声明或初始化的原因 可能 是,编译器通过重用寄存器优化了代码,知道它必须在之前调用 memset 时为零。但这只是一个假设。
在我看来,代码仍然毫无用处,因为结果将始终为零,因为数组是用 0 初始化的。
我不明白循环内部发生了什么
char var_64;
char var_24;
int32_t r0_6 = 0;
do
{
*(&var_24 + r0_6) = *(&var_64 + r0_6);
r0_6 = r0_6 + 1;
}
while (r0_6 != 8);
我无法得到这部分:
*(&var_24 + r0_6) = *(&var_64 + r0_6);
是不是把var_24的地址加1,把var_64的地址加1赋给它? 指针 * 在这里做什么?
编辑:
这是来自另一个反编译器的相同反编译代码:
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
这里我觉得是一样的,只是把v29显示为一个数组
截至目前,代码调用 undefined behavior,因为您正在尝试使用变量 r0_6
,其中
- 有自动存储和。未初始化。
- 地址没有被占用
- 可以有陷阱表示。
然后,在稍后的某个时间点,一旦您初始化 r0_6
的值,您实际上是在尝试取消引用内存位置 *(&var_64 + r0_6)
,[当 r0_6
是除 0] 以外的任何值,这是无效的,它再次调用 undefined behavior.
简而言之,代码毫无意义。
也就是说,一般来说,语法
*(pointer -or- address)
表示indirection or dereference,即取消引用该内存位置以到达该位置的值。
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
由于这是反编译代码,我假设原始代码可能如下所示:
{
char v29[16];
int8_t v39[8];
memset(&v39, 0, sizeof (v39));
memset(v29, 0, sizeof(v29));
for(int i = 0; i < sizeof(v39); i++)
{
((char *)(&v39))[i] = v29[i];
}
}
这意味着你有一个二进制字节数组,转换为二进制值,忽略机器字节顺序,所以这可能只是代码的一部分,或者数组已经是正确的字节订单。
v10 未声明或初始化的原因 可能 是,编译器通过重用寄存器优化了代码,知道它必须在之前调用 memset 时为零。但这只是一个假设。
在我看来,代码仍然毫无用处,因为结果将始终为零,因为数组是用 0 初始化的。