原文連接: https://fanmingfei.com/posts/...html
這是系列文章第三篇:web
在第一篇文章中,我介紹了 WebAssembly 能夠導入的四中不一樣的類型。函數
valuespost
functionspa
memory.net
tables指針
最後一個可能有點陌生。什麼是 table import,它有什麼用呢?
有時在程序中,你想要有一個變量指向一個函數,就像一個回調。而後你能夠把它傳遞給其餘的方法。
在 C 語言中,這叫作函數指針。函數存在內存中。變量,函數指針,只是指向該內存地址。
若是須要,之後能夠將變量指向一個不一樣的函數。這應該是一個熟悉的概念。
在 web 頁面中,全部的方法都是 JavaScript 對象並且因爲它們是 JavaScript 對象,因此它們存在於 WebAssembly 內存以外的內存地址中。
若是咱們想要一個指向其中一個函數的變量,咱們須要把它的地址放在咱們的內存中。
保證網頁安全的一部分是保證內存地址的不可見。你不但願頁面上的代碼能夠看到或操做這些內存地址。若是頁面上有惡意代碼,它可使用修改內存來建立漏洞。
例如,它可能會更改你的內存地址,以指向不一樣的內存位置。
那麼當你嘗試調用這個函數的時候,你會加載攻擊者給你的內存地址。
多是以某種方式插入到內存中的惡意代碼,可能嵌入到字符串中。
Tables 可能實現相似函數指針的東西,這樣不容易受到這些攻擊的影響。
Table 是存在於 WebAssembly 內存以外的數組。它的值是對函數的引用。
這些引用包含內存地址,但因爲它不在 WebAssembly 的內存中,WebAssembly 不能看到這些地址。
但它確實能夠訪問數組索引。
若是 WebAssembly 模塊想要調用這些函數,它將該索引傳遞給一個名爲call_indirect
的操做。這樣就能夠調用函數了。
如今,Table 的用例很是有限。它被添加到用於支持函數指針的規範中,由於C/C++很是依賴函數指針。
因此,當前惟一可使用table來引用的只有函數可是隨着WebAssembly擴展的功能,例如,當添加對DOM的直接訪問時,你可能將會看到Table上存儲着其餘的類型的引用,和除了call_indirect
以外的操做。