我有一些反编译的C源代码,看到了这个奇怪的字符串赋值。
char v1[21];
v1[0] = 0x75767778;
"tsrqponmlkjihgfedcba" = v1;
发生了什么事?这怎么可能?
答案 0 :(得分:6)
char v1[21];
到目前为止没问题;将v1
定义为21个char
元素的数组。
v1[0] = 0x75767778;
合法但不正确。 v1[0]
是char
个对象。除非CHAR_BIT >= 32
(不太可能),否则它不能保留值0x75767778
。如果普通char
未签名且CHAR_BIT==8
,则会指定值0x78
;如果普通char
已签名,则可能执行相同操作,但该值是实现定义的。
0x75767778
的字节可能与字符'u'
,'v'
,'w'
和'x'
的ASCII代码相关。
"tsrqponmlkjihgfedcba" = v1;
这完全是非法的。字符串文字不能是赋值的左侧,C不支持数组赋值。
显然你的“反编译器”(你还没有发现)正在生成或多或少看起来像C的东西,但却没有。
如果分配的左侧和右侧被反转,则可能部分解释。即使是这种情况,输出似乎也是某种伪代码。 (代码是否实际使用=
而不是->
或=>
?)
查看“反编译”的源代码会有所帮助 - 就像知道你正在使用什么“反编译器”并查看其文档一样。
我的 guess 是源代码有一个字符串文字,如"xwvutsrqponmlkjihgfedcba"
,生成的代码使用整数赋值来复制"xwvu"
(表示为{{1} })和剩下的20个字符的单独操作,但这只是一个猜测。或者它可能是0x75767778
,并且由于字节排序而被颠倒了。