惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
月光博客
月光博客
D
DataBreaches.Net
L
LangChain Blog
美团技术团队
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog
I
InfoQ
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
博客园 - 三生石上(FineUI控件)
腾讯CDC
Martin Fowler
Martin Fowler

博客园 - Franky

从ES5 的 函数声明与函数表达式说起. manifest 和 application cache 一套有趣的 javascript题. URL 中,查询字符串与HTML实体冲突,可能带来的问题. 从 null >= 0 说起 深入剖析,什么是eval的直接调用. 凑凑热闹,给eval做个科普. 浏览器静态资源的版本控制新思路.强制更新指定资源缓存.的探讨 IE6 与 GZIP, BUG汇总 ES3和ES5中函数调用(function call) 的浏览器实现差异. 你应该了解的 一些web缓存相关的概念. html5 performance 的应用尝试. HTML5 performance API 草案. Object.defineProperty 接口浏览器实现的bug.和疑惑 window.open 浏览器差异. IE9的特性变化,(收集贴) 关于p3p 简洁策略,以及浏览器的支持情况. 心神不宁啊... UI线程的阻塞.
Chrome v8引擎 对多行注释,做词法分析时的bug.
Franky · 2011-03-20 · via 博客园 - Franky

此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版本号-的形式 ,就是这个版本之前(包括这个版本)都如此.