C++编写的WASM应用在Safari报Out of bounds call_indirect错误求助
Out of bounds call_indirect错误的可能原因 这个错误是Safari处理WebAssembly间接函数调用时的典型问题,结合你的场景(Chrome/Firefox正常),常见诱因如下:
函数表兼容性差异
不同浏览器对WebAssembly的function table(函数表)实现逻辑不同。Chrome和Firefox会自动处理函数表索引的边界校验或动态扩容,但Safari在遇到未注册的函数索引时直接抛出越界错误。如果你的C++代码里有动态生成函数指针、间接调用未正确注册到函数表的逻辑,或者编译时的函数表配置未适配Safari,就会触发这个问题。Emscripten编译选项未适配Safari
若用Emscripten编译C++到Wasm,以下配置可能引发Safari兼容问题:- 启用
-s ALLOW_MEMORY_GROWTH=1时,搭配的函数表动态扩展逻辑在Safari中失效; - 未添加
-s SUPPORT_SAFARI=1这类针对Safari的兼容编译选项,导致生成的Wasm调用逻辑不符合Safari的处理规则。
- 启用
函数导出/命名异常
错误信息里提到wasmExports["ge"],这大概率是编译混淆后的函数名,原本的_main函数导出出现了异常。Safari对Wasm导出函数的符号处理、命名规则和Chrome/Firefox存在差异,导致无法正确映射到对应的函数表索引,最终触发越界调用。Promise初始化时序问题
错误属于未处理的Promise拒绝,说明Wasm模块的加载/初始化是异步流程,但你的代码没有正确捕获错误。同时Safari的Promise异步时序和其他浏览器不同,可能在Wasm模块还未完成函数表填充时就调用了_main函数,此时函数索引自然超出边界。Safari版本过旧
旧版Safari对WebAssembly的支持存在缺陷,比如函数表动态扩展、间接调用类型校验等特性在旧版本中存在bug。建议确认测试环境的Safari版本,尽量使用Safari 15及以上的稳定版本。
内容的提问来源于stack exchange,提问作者Rodrigo

