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

推荐订阅源

T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
T
Troy Hunt's Blog
O
OpenAI News
S
Securelist
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Proofpoint News Feed
S
Secure Thoughts
Martin Fowler
Martin Fowler
H
Hacker News: Front Page
博客园_首页
Security Latest
Security Latest
Cyberwarzone
Cyberwarzone
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
雷峰网
雷峰网
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
Jina AI
Jina AI
S
Security @ Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
S
Security Affairs
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
P
Privacy & Cybersecurity Law Blog
罗磊的独立博客
G
Google Developers Blog
L
Lohrmann on Cybersecurity
量子位
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
大猫的无限游戏
大猫的无限游戏
T
Threat Research - Cisco Blogs
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Webroot Blog
Webroot Blog
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy
有赞技术团队
有赞技术团队

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