Adobe Flash CS3 的 Auto-format 存在严重的 Bug

Adobe Flash CS3 的 Auto-format 存在严重的 Bug,它会去掉你的表达式中的括号,这样很可能使你的程序中表达式的运算优先级变得跟你写的优先级不同。

今天写 PHPRPC for ActionScript 3.0 的 MD5 程序时,就遇到了这个问题。程序是从 ActionScript 2.0 改写过来的,基本上没做什么修改,就是把类的定义部分改成了 AS3 的写法,另外,把 Number 类型改成了 int 类型(加速了很多),最后将 add32 那个函数直接去掉,换成了系统的加法运算(因为 int 类型可以保证溢出的正确处理),做完这些后,点了一下 Auto-format 按钮,格式化了一下代码。然后在调试程序,发现跟 AS2 的运行结果不同了,开始以为 AS2 的版本有问题,然后又跟 JavaScript 的版本对比了一下结果,发现 JavaScript 的运行结果跟 AS2 版本一致,跟 AS3 版本不同,这样就说明错误发生在 AS3 版本上了。于是就以为是那些优化出了问题。没办法,只好把 AS2 的核心代码原封不动的粘贴到 AS3 中,因为没有对齐,所以我就又点了一下 Auto-format 按钮。之后运行测试程序,发现跟原来错误的 AS3 程序结果还是一样。于是有以为 AS3 的数字运算本身有问题,于是把用到的加、减、位移、与或非等运算单独测试,发现也没有什么问题。最后,实在没有办法,在JavaScript 和 ActionScript 3.0 两个版本中都进行单步跟踪,看是在那步出了问题,最后定位在 ii 函数上,定位到 ii 函数一看,终于被我找到了问题,原来,ii 函数中的表达式被改写了,原表达式是:

ActionScript代码
 
  1. private static function ii(a:int, b:int, c:int, d:int, x:int, s:int, t:int):int {   
  2.     return cmn(c ^ (b | (~d)), a, b, x, s, t);   
  3. }  

居然被改写成了下面这样:

ActionScript代码
 
  1. private static function ii(a:int, b:int, c:int, d:int, x:int, s:int, t:int):int {   
  2.     return cmn(c ^ b | ~ d, a, b, x, s, t);   
  3. }  

这个改写让本来先或后与,变成了先与后或,结果当然就完全不同了。

看来再好用的工具也不能太依赖它,否则,它有 Bug 你不知道的话,你就会被它害惨!

标签: ActionScript/Flash

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):