Chrome v8引擎 对多行注释,做词法分析时的bug.

此BUG,已修复了. 具体哪个版本修复的,我懒得去验证了,我手里的15,16已经是修复了...

 

先看一个注释的写法:

/* 个/ */

这个在chrome下会抛出异常. 

Uncaught SyntaxError: Unexpected token *

原因是,汉字个的 Unicode 为 4e2a , 而chrome的程序员,为了加速词法分析,简单的使用了下面这种逻辑:

1,扫描到/* ,就快速向后搜索,一但遇到 code point为 2a+\u002f 的情况,他就简单认为这是 */ .所以认为注释结束了. 然后直接忽略掉注释部分,(即把他们从输入元素流中踢出去.注意我之所以提到直接忽略,是因为这里还隐含另外一个bug. 具体的后面解释). 然后继续向后扫描,这时候它遇到了 * ,. 因为这玩意属于ECMAScript的标准的token之一.即属于标点符号中的一个.可能是一个乘法运算符. tokenizer把他作为一个token处理鸟. 那么语法分析时就会是个悲剧.

所以,比如什么 伪/  等code point是**2a的和/在一起 出现在 多行注释内. chrome就注定悲剧.但是异常信息会有可能不同, 这完全取决于, 伪/ 后面是什么. 比如后面还有 /,那么语法分析时,甚至会认为你这里存在一个错误的正则表达式直接量 相关的异常.比如未闭合的,正则表达式文法的 goal symbol.

我觉得chrome的程序员大概是认为,注释都是ascii字符.因为ascii字符中只有*星号是符合**2a的字符. 如果这样的话,我们有理由举起个反对语言歧视的牌子.去喷google. 毕竟这么多国家,这么多语种的程序员.写注释都得写英文么?


再说说另外一个关于词法分析期,chrome 对多行注释扫描,偷懒的现象. 当然,这个问题,不仅仅是chrome有.还有一些其他浏览器.

参考下面的代码:
   
            alert(function(){
                    return /*
                              */ 1;
               }()); // 打印1的,没有遵守标准.
 
ECMA262 Edition3,5.中对于多行注释中,存在行终结符的情况,都是一致的.要求这个多行注释,不是简单的被忽略,而是要被替换为一个行终结符插入到流中.而一旦return 和 1之间的多行注释被替换为一个行终结符,则ECMA262的自动插入分号机制,就要产生作用.自动在token 1前面加入分号.那么打印undefined.才是符合标准的做法.
 
对于这一点,浏览器的实现并不一致.
IE6-IE8, Firefox0.8-Firefox3.0, Safari5-, chrome11- 都打印1.即并没有遵守标准.
而 IE9 , Firefox3.5+ , Opera11-(测到9.2),则打印undefined,遵守了标准.

补充说明:xxx版本号-的形式 ,就是这个版本之前(包括这个版本)都如此.

 

 

 

posted @ 2011-03-20 17:51  Franky  阅读(3998)  评论(17编辑  收藏  举报