在分析Powershield保护过的代码时,遇到非常低概率地出现了如下错误的跳转:
GET BOOL_TRUE //注意这里
GET BOOL_FALSE
IF LOGIC_FALSE THEN JUMP TO 正确的地址 //匹配第二个BOOL_FALSE可以正确跳
IF LOGIC_FALSE THEN JUMP TO 正确的地址 //这里其实会执行不到
而且出现多行sqlca.sqlcode <> 0 判断跳到如上逻辑的开头。而sqlca.sqlcode <> 0 判断之后是messagebox错误提示以及return -1或return 1,所以逻辑核对是很容易判断。我想这个是Powershield存在的bug。采用反编译测试,在代码段头部,出现多个嵌套的do。证明这个跳转的确不对。Powershield的原意应该是:
GET BOOL_TRUE //注意这里
GET BOOL_FALSE
IF LOGIC_FALSE THEN JUMP TO 正确的地址 //匹配第二个BOOL_FALSE可以正确跳
IF LOGIC_TRUE THEN JUMP TO 正确的地址 //这里才会执行
为什么这么判断呢,还有个原因是因为代码在此处只需要连接(sqlca.sqlcode <> 0判断之后错误与正确跳转之间),而不是需要
if true then
//
else
//
end if
这样的毫无意义的逻辑判断。
这个错误将引起死循环或者运行时报错。
以上只是疑似和自己的猜错,有遇到混淆后出现运行错误的可以告诉我。。