被下面的一段伪代码搞糊涂了:
if ( (unsigned int)a2 - 15 > 4 )
__gnat_rcheck_05("page_s_data_list.adb", 1027);
memcpy(v27, &v2[300 * a2 - 4496], 0x12Cu);
为什么v2的下标中要减去4496?这样会越界吗?
后来发现:4496=300*15-4。
也就是,&v2[300 * a2 - 4496]相当于&v2[300 * (a2 - 15)+ 4]。
v2是一个指针,它指向的是一个名为mmi_server_types__result_data_fm_command_t的结构类型。
该类型的一个名为u96分量。u96在该结构中的偏移量是4。
u96是一个结构数组,结构的大小是300字节,数组的下标范围是(0..4)。
再有,前面的if语句是检查下标(a2 - 15)是否越界。
memcpy调用中的第3个参数0x12Cu就是300。
由于v27的类型与u96的分量类型相同,因此可把memcpy调用语句改为赋值语句。
最后修改为:v27 = v2->u96[a2 - 15];
7667

被折叠的 条评论
为什么被折叠?



