C字符串分配向后

时间:2015-07-18 22:09:37

标签: c

我有一些反编译的C源代码,看到了这个奇怪的字符串赋值。

char v1[21];
v1[0] = 0x75767778;
"tsrqponmlkjihgfedcba" = v1;

发生了什么事?这怎么可能?

1 个答案:

答案 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,并且由于字节排序而被颠倒了。