You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编写的WASM应用在Safari报Out of bounds call_indirect错误求助

Safari中WebAssembly应用出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:27:14