Chrome v8引擎 對多行注釋,做詞法分析時的bug.

來源:互聯網
上載者:User

此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就註定悲劇.但是異常資訊會有可能不同, 這完全取決於, 偽/ 後面是什麼. 比如後面還有 /,那麼文法分析時,甚至會認為你這裡存在一個錯誤的Regex直接量 相關的異常.比如未閉合的,Regex文法的 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版本號碼-的形式 ,就是這個版本之前(包括這個版本)都如此.

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.