原文连接: 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
以外的操做。