最近编译器都是老奇葩了

「已注销」 2013-09-18 10:53:16
已经不是第一次了,编译器老是篡改我的意图,之前找PhkFirstGlobalValid的函数地址,特征匹配的时候,往回匹配代码
while( *pbuf != 0x90 )
{
pbuf--;
}
结果死循环了,不调不知道,一调,擦,,*pbuf被编译成固定值存在寄存器中,每次pbuf--后,寄存器还是原来的值去跟0x90比较,泪流满面啊。
可能是我代码风格写的特别乱吧,编译器老是跟我作对,我都无语了。
编译环境:win7 sp1 x64
编译器: VC++6.0、VS 2008
编译代码
#include <stdio.h>

int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, char* argv[])
{
int total = 0;
int xinqi = 2;
for (int i=0; i<12; i++)
{
for (int j=0; j<month[i]; j++, xinqi++)
{
if ( xinqi == 6 || xinqi == 7 )
{
total++;
}
if ( xinqi == 8 )
{
xinqi == 1;
}
}
}
printf("%d\n", total);
return 0;
}


VC6编译结果(问题部分):
19:               {
20: total++;
00401084 mov edx,dword ptr [ebp-4]
00401087 add edx,1
0040108A mov dword ptr [ebp-4],edx
21: }
22: if ( xinqi == 8 )
23: {
24: xinqi == 1;
25: }
26: }
0040108D jmp main+47h (00401057)
27: }
0040108F jmp main+2Fh (0040103f)

VS2008编译结果:

{
if ( xinqi == 6 || xinqi == 7 )
0042D68E cmp dword ptr [xinqi],6
0042D692 je main+7Ah (42D69Ah)
0042D694 cmp dword ptr [xinqi],7
0042D698 jne main+83h (42D6A3h)
{
total++;
0042D69A mov eax,dword ptr [total]
0042D69D add eax,1
0042D6A0 mov dword ptr [total],eax
}
if ( xinqi == 8 )
{
xinqi == 1;
}
}
0042D6A3 jmp main+4Dh (42D66Dh)
}
0042D6A5 jmp main+35h (42D655h)
printf("%d\n", total);

这样的编译结果真受伤。。。。
if ( xinqi == 8 )
{
xinqi == 1;
}
代码怎么啦?编译器就认为是费代码,基可以直接抛弃?Debug模式下不应该啊,如果说是Release下把这段代码吃掉了,那我还信,为什么Debug下无任何优化却会消失?神一般的存在。
...全文
108 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-09-18
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
if ( xinqi == 8 ) { xinqi == 1;//这里是不是多了个 = 号 }
好吧,我错了。不过之前的代码的确是正确的,被VC6搞错,VS08正确的,还以为这次也是
乃不知有汉 2013-09-18
  • 打赏
  • 举报
回复
加个 volatile 试试?
  • 打赏
  • 举报
回复
if ( xinqi == 8 ) { xinqi == 1;//这里是不是多了个 = 号 }
注意事项: 1、确定myeclipse2015_keygen文件夹中有privateKey.bytes(传说中的私钥)和publicKey.bytes(传说中的公钥)。 2、确定你没有点过算号器的RebuildKey,保证公钥和私钥没有被换过。 3、满足上述条件请略过第三步;如果上述条件不满足,请使用如下步骤: 3.1、首先点击RebuildKey,重新生成公钥和私钥。 3.2、winrar打开com.genuitec.eclipse.server.core_XXX.jar包,用新生成的publicKey.bytes替换进去(com\genuitec\eclipse\server\core)。 注意:做完第三步不要再手贱去点RebuildKey了,点一次就要重新进行一下3~7步,因为要保证生成注册码时候的密钥和jar包里的一致。 4、破解之前请确保从未启动MyEclipse,如果你已经开过则需卸载重装,否则你会遭遇打开编译器,然后校验失败,报错关闭。 5、工作空间需要用新的,不要用旧版本的了,如果你是Stable1.0破解过,正常用的工作空间也可以。 安装步骤: 1、双击crack.bat,填写Usercode,版本选择Bling版,点击SystemID,当生成SystemID后,点击Active激活。 如果点击SystemId提示 Cannot find JNIWrapper native library (jniwrap.dll) in java.library.path: 这样的错误,不要紧,再点一下应该就出来了,还是没有的话请注意权限问题(主要是Mac和Linux) 2、点SaveProperites把注册码保存到文件,这样就不用手动填了,如果有以前版本的,想要多版本共存,请看后面吧。 注意:有些需要做如下步骤 将myeclipse2015_keygen/publicKey.bytes换掉patch/plugins/com.genuitec.eclipse.core_13.0.0.me201501141551.jar里的com.genuitec/eclipse/core/publicKey.bytes。 3、将patch\plugins文件夹复制到MyEclipse的plugins并覆盖原文件 Mac版插件目录在MyEclipse 2015.app/Contents/Profile/plugins,替换时请选合并,不是覆盖(覆盖会把整个文件夹替换掉,不该删的都没了,后果自己脑补吧) 4、删除MyEclipse的plugins/com.genuitec.eclipse.mobile.phonegap.core_13.0.0.me201504281437文件夹下: bin/com/genuitec/eclipse/mobile/phonegap/core/internal/{PhonegapProjectManagerImpl$1.class 和 PhonegapProjectManagerImpl$2.class} com/genuitec/eclipse/mobile/phonegap/core/internal/{PhonegapProjectManagerImpl$1.class 和 PhonegapProjectManagerImpl$2.class} 多版本共存有两种方法: 1、一种是备份 .myeclipse.properties 这个文件(保存的注册信息),然后根据你想要用的版本去换。 2、使用同一个公钥(publicKey.bytes)替换掉各版本的com.genuitec.eclipse.server.core_XXXXXXXX.jar包中的对应文件,这种办法需要各版本MyEclipse都是同一种授权的,比如都是Professional,都是Bling之类的 注意点我都写在步骤里了,大家认真看,看明白了再动手,完全按照我给的步骤,不会出现各种奇葩问题的(比如还是会报校验错误,比如Web工程不能新建,比如视图问题)。
下面开始本次Stable2.0的破解步骤(其实和1.0一样,大概写一下,就不重新截图了) 0.先说一下Usercode需要自己填写,这个随意 然后SystemId需要点击按键生成——这个如果提示 Cannot find JNIWrapper native library (jniwrap.dll) in java.library.path: 这样的错误,不要紧,再点一下应该就出来了,还是没有的话请注意权限问题(主要是Mac和Linux) 还有就是破解之前请不要开启你的MyEclipse,要保持刚安装完的状态,如果你已经开过了,卸载重装吧——否则你就会遭遇打开编译器,然后校验失败,报错关闭 工作空间需要用新的,不要用旧版本的了——如果你是Stable1.0破解过,正常用的工作空间也可以 1.请确定你的算号器,也就是myeclipse2015_keygen文件夹中有privateKey.bytes(传说中的私钥)和publicKey.bytes(传说中的公钥),如果我的压缩包你解压以后没删过东西应该是有的 2.请确定你没有点过算号器的RebuildKey,保证公钥和私钥没有被换过 3.满足上述条件请略过第三步;如果上述条件不满足,也没关系,就是麻烦一点儿—— 3.1首先点击RebuildKey,重新生成公钥和私钥 3.2用winrar打开 com.genuitec.eclipse.server.core_XXXXXXXX.jar 这个jar包,用新生成的publicKey.bytes替换进去(路径是com\genuitec\eclipse\server\core),替换完不要做其他操作,关闭就好 3.3然后可以进行后面的步骤了(注意做完第三步不要再手贱去点RebuildKey了,点一次就要重新进行一下3~7步,因为要保证生成注册码时候的密钥和jar包里的一致) 4.选择版本——算号器我添加了Bling版的,大家懂的 5.在算号器填好Usercode,并生成了SystemId后,点Active 6.点SaveProperites把注册码保存到文件,这样就不用手动填了——如果有以前版本的,想要多版本共存,请看后面吧 7.把补丁包(patch)里的plugins复制到MyEclipse的plugins覆盖原文件(可以参考1.0的破解步骤里面的图) *Mac用户注意:Mac版的插件目录在MyEclipse 2015.app/Contents/Profile/plugins,替换时候请注意要选合并,不是覆盖(覆盖会把整个文件夹替换掉,不该删的都没了,后果自己脑补吧) 8.最后一步,MyEclipse的plugins/com.genuitec.eclipse.mobile.phonegap.core_13.0.0.me201504281437这个文件夹中,bin/com/genuitec/eclipse/mobile/phonegap/core/internal 以及 com/genuitec/eclipse/mobile/phonegap/core/internal 里面,都要删除 PhonegapProjectManagerImpl$1.class 和 PhonegapProjectManagerImpl$2.class,一共4个内部类,切记一定要删掉(参考http://tieba.baidu.com/p/3565112704?pid=64089385838&cid=0#64089385838) 接下来就可以用了 想要多版本共存的,有两种方法,一种是备份 .myeclipse.properties 这个文件(保存的注册信息),然后根据你想要用的版本去换 另一种办法一劳永逸的,使用同一个公钥(publicKey.bytes)替换掉各版本的com.genuitec.eclipse.server.core_XXXXXXXX.jar包中的对应文件,这种办法需要各版本MyEclipse都是同一种授权的,比如都是Professional,都是Bling之类的 注意点我都写在步骤里了,大家认真看,看明白了再动手,完全按照我给的步骤,不会出现各种奇葩问题的(比如还是会报校验错误,比如Web工程不能新建,比如视图问题)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧