MALOUDA-PSA 2024-04-23 15:30 采纳率: 90.5%
浏览 2
已结题

webassembly 的问题

html 代码:

<html>
  <head>
    <meta charset="utf-8">
    <title>Wasm:demo</title>
  </head>
  <body>
    <script>
    Module = {};
    Module.onRuntimeInitialized = function() {
        var str = '31415';
        var strBuff = new TextEncoder().encode(str);
        var strPtr = Module._malloc(strBuff.length + 1111);
        Module.HEAPU8.set(strBuff, strPtr);
        Module.HEAPU8[strPtr + strBuff.length] = 0;
        console.log('str2Num:', Module._str2Num(strPtr));
        //Module._free(strPtr);

        console.log('mathAdd:', Module._mathAdd(250, 250));
        console.log('mathMulti:', Module._mathMulti(3.14, 3.0));
        console.log('EncryptionAES:', Module._EncryptionAES("str", "aaab", "kkrr", strPtr));
//      console.log(strPtr);
        Module._free(strPtr);


c++:

EMSCRIPTEN_KEEPALIVE
int EncryptionAES(const char * strSrc, const char * gkey, const char* giv, char** str) 
{
    ...  ... ... 
EM_ASM_({
        var jsStr = Pointer_stringify($0);
        jstr=jsStr;
    }, *str);

        return 1;
}

运行后,html报错:

webassemencdec.wasm:0xa700 Uncaught (in promise) RuntimeError: memory access out of bounds
    at webassemencdec.wasm:0xa700
    at webassemencdec.wasm:0xa737
    at webassemencdec.wasm:0x969c
    at webassemencdec.wasm:0x12de
    at Object._EncryptionAES (webassemencdec.js:611:12)
    at Module.onRuntimeInitialized (demo.html:22:40)
    at doRun (webassemencdec.js:4732:71)
    at run (webassemencdec.js:4749:5)
    at runCaller (webassemencdec.js:4693:19)
    at removeRunDependency (webassemencdec.js:547:7)

  • 写回答

4条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-23 15:30
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题分析:

    根据报错信息可以看出,内存访问越界导致了错误。具体来说,是在内存分配时存在偏移量问题,导致对内存访问越界。

    解决方案:

    1.修改偏移量,保证内存访问不越界

    2.查看内存分配是否正确,可以使用工具查看内存分配情况

    3.根据具体情况分析代码原因,修改问题代码

    正确代码:

    html 代码:

    <html>
      <head>
        <meta charset="utf-8">
        <title>Wasm:demo</title>
      </head>
      <body>
        <script>
        Module = {};
        Module.onRuntimeInitialized = function() {
            var str = '31415';
            var strBuff = new TextEncoder().encode(str);
            var strPtr = Module._malloc(strBuff.length + 1);
            Module.HEAPU8.set(strBuff, strPtr);
            Module.HEAPU8[strPtr + strBuff.length] = 0;
            console.log('str2Num:', Module._str2Num(strPtr));
            //Module._free(strPtr);
    
            console.log('mathAdd:', Module._mathAdd(250, 250));
            console.log('mathMulti:', Module._mathMulti(3.14, 3.0));
            console.log('EncryptionAES:', Module._EncryptionAES("str", "aaab", "kkrr", strPtr));
    //      console.log(strPtr);
            Module._free(strPtr);
        };
        </script>
        <script src="./webassemencdec.js"></script>
      </body>
    </html>
    

    c++:

    EMSCRIPTEN_KEEPALIVE
    int EncryptionAES(const char * strSrc, const char * gkey, const char* giv, char** str) 
    {
        ...  ... ... 
        EM_ASM_({
            var jsStr = Pointer_stringify($0);
            jstr=jsStr;
        }, *str);
    
        return 1;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要