shared_heap_test.cc 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. /*
  2. * Copyright (C) 2024 Xiaomi Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "test_helper.h"
  6. #include "gtest/gtest.h"
  7. #include "bh_read_file.h"
  8. #include "wasm_runtime_common.h"
  9. #include <gtest/gtest-spi.h>
  10. class shared_heap_test : public testing::Test
  11. {
  12. protected:
  13. virtual void SetUp() {}
  14. static void SetUpTestCase() {}
  15. virtual void TearDown() {}
  16. WAMRRuntimeRAII<512 * 1024> runtime;
  17. };
  18. struct ret_env {
  19. wasm_exec_env_t exec_env;
  20. wasm_module_t wasm_module;
  21. wasm_module_inst_t wasm_module_inst;
  22. unsigned char *wasm_file_buf;
  23. char error_buf[128];
  24. };
  25. static void
  26. destroy_module_env(struct ret_env module_env);
  27. static bool
  28. load_wasm(char *wasm_file_tested, unsigned int app_heap_size,
  29. ret_env &ret_module_env)
  30. {
  31. char *wasm_file = strdup(wasm_file_tested);
  32. unsigned int wasm_file_size = 0;
  33. unsigned int stack_size = 16 * 1024, heap_size = app_heap_size;
  34. char error_buf[128] = { 0 };
  35. ret_module_env.wasm_file_buf =
  36. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  37. if (!ret_module_env.wasm_file_buf) {
  38. goto fail;
  39. }
  40. ret_module_env.wasm_module =
  41. wasm_runtime_load(ret_module_env.wasm_file_buf, wasm_file_size,
  42. error_buf, sizeof(error_buf));
  43. if (!ret_module_env.wasm_module) {
  44. memcpy(ret_module_env.error_buf, error_buf, 128);
  45. goto fail;
  46. }
  47. ret_module_env.wasm_module_inst =
  48. wasm_runtime_instantiate(ret_module_env.wasm_module, stack_size,
  49. heap_size, error_buf, sizeof(error_buf));
  50. if (!ret_module_env.wasm_module_inst) {
  51. memcpy(ret_module_env.error_buf, error_buf, 128);
  52. goto fail;
  53. }
  54. ret_module_env.exec_env = wasm_runtime_create_exec_env(
  55. ret_module_env.wasm_module_inst, stack_size);
  56. if (!ret_module_env.exec_env) {
  57. goto fail;
  58. }
  59. free(wasm_file);
  60. return true;
  61. fail:
  62. free(wasm_file);
  63. destroy_module_env(ret_module_env);
  64. return false;
  65. }
  66. void
  67. destroy_module_env(struct ret_env module_env)
  68. {
  69. if (module_env.exec_env) {
  70. wasm_runtime_destroy_exec_env(module_env.exec_env);
  71. }
  72. if (module_env.wasm_module_inst) {
  73. wasm_runtime_deinstantiate(module_env.wasm_module_inst);
  74. }
  75. if (module_env.wasm_module) {
  76. wasm_runtime_unload(module_env.wasm_module);
  77. }
  78. if (module_env.wasm_file_buf) {
  79. wasm_runtime_free(module_env.wasm_file_buf);
  80. }
  81. }
  82. static void
  83. test_shared_heap(WASMSharedHeap *shared_heap, const char *file,
  84. const char *func_name, uint32 argc, uint32 argv[])
  85. {
  86. struct ret_env tmp_module_env;
  87. WASMFunctionInstanceCommon *func_test = nullptr;
  88. bool ret = false;
  89. if (!load_wasm((char *)file, 0, tmp_module_env)) {
  90. ADD_FAILURE() << "Failed to load wasm file\n";
  91. goto fail0;
  92. }
  93. if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst,
  94. shared_heap)) {
  95. ADD_FAILURE() << "Failed to attach shared heap\n";
  96. goto fail1;
  97. }
  98. func_test = wasm_runtime_lookup_function(tmp_module_env.wasm_module_inst,
  99. func_name);
  100. if (!func_test) {
  101. ADD_FAILURE() << "Failed to wasm_runtime_lookup_function!\n";
  102. goto fail2;
  103. }
  104. ret =
  105. wasm_runtime_call_wasm(tmp_module_env.exec_env, func_test, argc, argv);
  106. if (!ret) {
  107. const char *s =
  108. wasm_runtime_get_exception(tmp_module_env.wasm_module_inst);
  109. ADD_FAILURE() << "Failed to wasm_runtime_call_wasm with "
  110. << "exception: " << s;
  111. }
  112. fail2:
  113. wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst);
  114. fail1:
  115. destroy_module_env(tmp_module_env);
  116. fail0:
  117. return;
  118. }
  119. TEST_F(shared_heap_test, test_shared_heap_basic)
  120. {
  121. SharedHeapInitArgs args = { 0 };
  122. WASMSharedHeap *shared_heap = nullptr;
  123. uint32 argv[1] = { 0 };
  124. args.size = 1024;
  125. shared_heap = wasm_runtime_create_shared_heap(&args);
  126. if (!shared_heap) {
  127. FAIL() << "Failed to create shared heap";
  128. }
  129. test_shared_heap(shared_heap, "test.wasm", "test", 0, argv);
  130. EXPECT_EQ(10, argv[0]);
  131. test_shared_heap(shared_heap, "test.aot", "test", 0, argv);
  132. EXPECT_EQ(10, argv[0]);
  133. test_shared_heap(shared_heap, "test_chain.aot", "test", 0, argv);
  134. EXPECT_EQ(10, argv[0]);
  135. }
  136. TEST_F(shared_heap_test, test_shared_heap_malloc_fail)
  137. {
  138. SharedHeapInitArgs args = { 0 };
  139. WASMSharedHeap *shared_heap = nullptr;
  140. uint32 argv[1] = { 0 };
  141. args.size = 1024;
  142. shared_heap = wasm_runtime_create_shared_heap(&args);
  143. if (!shared_heap) {
  144. FAIL() << "Failed to create shared heap";
  145. }
  146. test_shared_heap(shared_heap, "test.wasm", "test_malloc_fail", 0, argv);
  147. EXPECT_EQ(1, argv[0]);
  148. test_shared_heap(shared_heap, "test.aot", "test_malloc_fail", 0, argv);
  149. EXPECT_EQ(1, argv[0]);
  150. test_shared_heap(shared_heap, "test_chain.aot", "test_malloc_fail", 0,
  151. argv);
  152. EXPECT_EQ(1, argv[0]);
  153. }
  154. TEST_F(shared_heap_test, test_preallocated_shared_heap_malloc_fail)
  155. {
  156. SharedHeapInitArgs args = { 0 };
  157. WASMSharedHeap *shared_heap = nullptr;
  158. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  159. uint8 preallocated_buf[BUF_SIZE];
  160. /* create a preallocated shared heap */
  161. args.pre_allocated_addr = preallocated_buf;
  162. args.size = BUF_SIZE;
  163. shared_heap = wasm_runtime_create_shared_heap(&args);
  164. if (!shared_heap) {
  165. FAIL() << "Create preallocated shared heap failed.\n";
  166. }
  167. /* test wasm can't malloc with preallocated shared heap */
  168. argv[0] = 1024;
  169. test_shared_heap(shared_heap, "test.wasm", "my_shared_heap_malloc", 1,
  170. argv);
  171. EXPECT_EQ(0, argv[0]);
  172. argv[0] = 1024;
  173. test_shared_heap(shared_heap, "test.aot", "my_shared_heap_malloc", 1, argv);
  174. EXPECT_EQ(0, argv[0]);
  175. argv[0] = 1024;
  176. test_shared_heap(shared_heap, "test_chain.aot", "my_shared_heap_malloc", 1,
  177. argv);
  178. EXPECT_EQ(0, argv[0]);
  179. }
  180. TEST_F(shared_heap_test, test_preallocated_shared_runtime_api)
  181. {
  182. struct ret_env tmp_module_env;
  183. SharedHeapInitArgs args = { 0 };
  184. WASMSharedHeap *shared_heap = nullptr;
  185. uint32 argv[1] = { 0 };
  186. void *native_ptr;
  187. uint64 offset, size;
  188. bool ret;
  189. args.size = 0x4000;
  190. shared_heap = wasm_runtime_create_shared_heap(&args);
  191. if (!shared_heap) {
  192. FAIL() << "Failed to create shared heap";
  193. }
  194. if (!load_wasm("test.wasm", 0, tmp_module_env)) {
  195. FAIL() << "Failed to load wasm file\n";
  196. }
  197. if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst,
  198. shared_heap)) {
  199. ADD_FAILURE() << "Failed to attach shared heap\n";
  200. goto fail1;
  201. }
  202. offset = wasm_runtime_shared_heap_malloc(tmp_module_env.wasm_module_inst,
  203. 32, &native_ptr);
  204. if (!offset) {
  205. ADD_FAILURE() << "Failed to attach shared heap\n";
  206. goto fail2;
  207. }
  208. size = (uint64_t)UINT32_MAX + 0x2000;
  209. printf("offset %lx size: %lx\n", offset, size);
  210. ASSERT_EQ(false, wasm_runtime_validate_app_addr(
  211. tmp_module_env.wasm_module_inst, offset, size));
  212. ASSERT_EQ(NULL, wasm_runtime_addr_app_to_native(
  213. tmp_module_env.wasm_module_inst, offset + size));
  214. size = (uint64_t)10;
  215. ASSERT_EQ(true, wasm_runtime_validate_app_addr(
  216. tmp_module_env.wasm_module_inst, offset, size));
  217. ASSERT_EQ(native_ptr + size,
  218. wasm_runtime_addr_app_to_native(tmp_module_env.wasm_module_inst,
  219. offset + size));
  220. fail2:
  221. wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst);
  222. fail1:
  223. destroy_module_env(tmp_module_env);
  224. }
  225. static void
  226. create_test_shared_heap(uint8 *preallocated_buf, size_t size,
  227. WASMSharedHeap **shared_heap_res)
  228. {
  229. SharedHeapInitArgs args = { 0 };
  230. WASMSharedHeap *shared_heap = nullptr;
  231. args.pre_allocated_addr = preallocated_buf;
  232. args.size = size;
  233. shared_heap = wasm_runtime_create_shared_heap(&args);
  234. if (!shared_heap) {
  235. FAIL() << "Create preallocated shared heap failed.\n";
  236. }
  237. *shared_heap_res = shared_heap;
  238. if (!*shared_heap_res) {
  239. FAIL() << "Create shared heap chain failed.\n";
  240. }
  241. }
  242. static void
  243. create_test_shared_heap_chain(uint8 *preallocated_buf, size_t size,
  244. uint8 *preallocated_buf2, size_t size2,
  245. WASMSharedHeap **shared_heap_chain)
  246. {
  247. SharedHeapInitArgs args = { 0 };
  248. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr;
  249. args.pre_allocated_addr = preallocated_buf;
  250. args.size = size;
  251. shared_heap = wasm_runtime_create_shared_heap(&args);
  252. if (!shared_heap) {
  253. FAIL() << "Create preallocated shared heap failed.\n";
  254. }
  255. memset(&args, 0, sizeof(args));
  256. args.pre_allocated_addr = preallocated_buf2;
  257. args.size = size2;
  258. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  259. if (!shared_heap2) {
  260. FAIL() << "Create preallocated shared heap failed.\n";
  261. }
  262. *shared_heap_chain =
  263. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  264. if (!*shared_heap_chain) {
  265. FAIL() << "Create shared heap chain failed.\n";
  266. }
  267. }
  268. TEST_F(shared_heap_test, test_shared_heap_rmw)
  269. {
  270. WASMSharedHeap *shared_heap = nullptr;
  271. uint32 argv[2] = { 0 }, BUF_SIZE = os_getpagesize();
  272. uint8 preallocated_buf[BUF_SIZE] = { 0 };
  273. uint32 start1, end1;
  274. create_test_shared_heap(preallocated_buf, BUF_SIZE, &shared_heap);
  275. /* app addr for shared heap */
  276. start1 = UINT32_MAX - BUF_SIZE + 1;
  277. end1 = UINT32_MAX;
  278. argv[0] = end1;
  279. argv[1] = 101;
  280. test_shared_heap(shared_heap, "test.wasm", "read_modify_write_8", 2, argv);
  281. EXPECT_EQ(0, argv[0]);
  282. EXPECT_EQ(preallocated_buf[BUF_SIZE - 1], 101);
  283. argv[0] = start1;
  284. argv[1] = 37;
  285. test_shared_heap(shared_heap, "test.wasm", "read_modify_write_8", 2, argv);
  286. EXPECT_EQ(0, argv[0]);
  287. EXPECT_EQ(preallocated_buf[0], 37);
  288. argv[0] = end1;
  289. argv[1] = 81;
  290. test_shared_heap(shared_heap, "test.aot", "read_modify_write_8", 2, argv);
  291. EXPECT_EQ(101, argv[0]);
  292. EXPECT_EQ(preallocated_buf[BUF_SIZE - 1], 81);
  293. argv[0] = start1;
  294. argv[1] = 98;
  295. test_shared_heap(shared_heap, "test.aot", "read_modify_write_8", 2, argv);
  296. EXPECT_EQ(37, argv[0]);
  297. EXPECT_EQ(preallocated_buf[0], 98);
  298. }
  299. TEST_F(shared_heap_test, test_shared_heap_chain_rmw)
  300. {
  301. SharedHeapInitArgs args = { 0 };
  302. WASMSharedHeap *shared_heap_chain = nullptr;
  303. uint32 argv[2] = { 0 }, BUF_SIZE = os_getpagesize();
  304. uint8 preallocated_buf[BUF_SIZE] = { 0 },
  305. preallocated_buf2[BUF_SIZE] = { 0 };
  306. uint32 start1, end1, start2, end2;
  307. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  308. BUF_SIZE, &shared_heap_chain);
  309. /* app addr for shared heap */
  310. start1 = UINT32_MAX - 2 * BUF_SIZE + 1;
  311. end1 = UINT32_MAX - BUF_SIZE;
  312. start2 = UINT32_MAX - BUF_SIZE + 1;
  313. end2 = UINT32_MAX;
  314. /* shared heap 1 */
  315. argv[0] = end1;
  316. argv[1] = 101;
  317. test_shared_heap(shared_heap_chain, "test.wasm", "read_modify_write_8", 2,
  318. argv);
  319. EXPECT_EQ(0, argv[0]);
  320. EXPECT_EQ(preallocated_buf[BUF_SIZE - 1], 101);
  321. /* shared heap 2 */
  322. argv[0] = start2;
  323. argv[1] = 129;
  324. test_shared_heap(shared_heap_chain, "test.wasm", "read_modify_write_8", 2,
  325. argv);
  326. EXPECT_EQ(0, argv[0]);
  327. EXPECT_EQ(preallocated_buf2[0], 129);
  328. argv[0] = start1;
  329. argv[1] = 98;
  330. test_shared_heap(shared_heap_chain, "test_chain.aot", "read_modify_write_8",
  331. 2, argv);
  332. EXPECT_EQ(0, argv[0]);
  333. EXPECT_EQ(preallocated_buf[0], 98);
  334. argv[0] = end2;
  335. argv[1] = 81;
  336. test_shared_heap(shared_heap_chain, "test_chain.aot", "read_modify_write_8",
  337. 2, argv);
  338. EXPECT_EQ(0, argv[0]);
  339. EXPECT_EQ(preallocated_buf2[BUF_SIZE - 1], 81);
  340. }
  341. TEST_F(shared_heap_test, test_shared_heap_chain_rmw_bulk_memory)
  342. {
  343. SharedHeapInitArgs args = { 0 };
  344. WASMSharedHeap *shared_heap_chain = nullptr;
  345. uint32 argv[3] = { 0 }, BUF_SIZE = os_getpagesize();
  346. uint8 preallocated_buf[BUF_SIZE] = { 0 },
  347. preallocated_buf2[BUF_SIZE] = { 0 };
  348. uint32 start1, end1, start2, end2;
  349. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  350. BUF_SIZE, &shared_heap_chain);
  351. /* app addr for shared heap */
  352. start1 = UINT32_MAX - 2 * BUF_SIZE + 1;
  353. end1 = UINT32_MAX - BUF_SIZE;
  354. start2 = UINT32_MAX - BUF_SIZE + 1;
  355. end2 = UINT32_MAX;
  356. argv[0] = end1;
  357. argv[1] = 101;
  358. argv[2] = 1;
  359. test_shared_heap(shared_heap_chain, "test_bulk_memory.wasm",
  360. "memory_fill_test", 3, argv);
  361. /* no modification since no return value */
  362. EXPECT_EQ(end1, argv[0]);
  363. EXPECT_EQ(preallocated_buf[BUF_SIZE - 1], 101);
  364. argv[0] = start1;
  365. argv[1] = 14;
  366. argv[2] = 1;
  367. test_shared_heap(shared_heap_chain, "test_bulk_memory_chain.aot",
  368. "memory_fill_test", 3, argv);
  369. /* no modification since no return value */
  370. EXPECT_EQ(start1, argv[0]);
  371. EXPECT_EQ(preallocated_buf[0], 14);
  372. /* nothing happen when memory fill 0 byte */
  373. argv[0] = start2;
  374. argv[1] = 68;
  375. argv[2] = 0;
  376. test_shared_heap(shared_heap_chain, "test_bulk_memory_chain.aot",
  377. "memory_fill_test", 3, argv);
  378. /* no modification since no return value */
  379. EXPECT_EQ(start2, argv[0]);
  380. EXPECT_EQ(preallocated_buf2[0], 0);
  381. argv[0] = end2;
  382. argv[1] = 98;
  383. argv[2] = 1;
  384. test_shared_heap(shared_heap_chain, "test_bulk_memory_chain.aot",
  385. "memory_fill_test", 3, argv);
  386. /* no modification since no return value */
  387. EXPECT_EQ(end2, argv[0]);
  388. EXPECT_EQ(preallocated_buf2[BUF_SIZE - 1], 98);
  389. }
  390. TEST_F(shared_heap_test, test_shared_heap_chain_rmw_bulk_memory_oob)
  391. {
  392. SharedHeapInitArgs args = { 0 };
  393. WASMSharedHeap *shared_heap_chain = nullptr;
  394. uint32 argv[3] = { 0 }, BUF_SIZE = os_getpagesize();
  395. uint8 preallocated_buf[BUF_SIZE] = { 0 },
  396. preallocated_buf2[BUF_SIZE] = { 0 };
  397. uint32 start1, end1, start2, end2;
  398. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  399. BUF_SIZE, &shared_heap_chain);
  400. /* app addr for shared heap */
  401. start1 = UINT32_MAX - 2 * BUF_SIZE + 1;
  402. end1 = UINT32_MAX - BUF_SIZE;
  403. start2 = UINT32_MAX - BUF_SIZE + 1;
  404. end2 = UINT32_MAX;
  405. /* shared heap 1 */
  406. argv[0] = end1;
  407. argv[1] = 101;
  408. argv[2] = 2;
  409. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  410. "test_bulk_memory.wasm",
  411. "memory_fill_test", 3, argv),
  412. "Exception: out of bounds memory access");
  413. argv[0] = end2;
  414. argv[1] = 98;
  415. argv[2] = 2;
  416. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  417. "test_bulk_memory.wasm",
  418. "memory_fill_test", 3, argv),
  419. "Exception: out of bounds memory access");
  420. argv[0] = start1;
  421. argv[1] = 98;
  422. argv[2] = BUF_SIZE + 1;
  423. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  424. "test_bulk_memory.wasm",
  425. "memory_fill_test", 3, argv),
  426. "Exception: out of bounds memory access");
  427. argv[0] = start2;
  428. argv[1] = 98;
  429. argv[2] = BUF_SIZE + 1;
  430. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  431. "test_bulk_memory.wasm",
  432. "memory_fill_test", 3, argv),
  433. "Exception: out of bounds memory access");
  434. argv[0] = end1;
  435. argv[1] = 101;
  436. argv[2] = 2;
  437. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  438. "test_bulk_memory_chain.aot",
  439. "memory_fill_test", 3, argv),
  440. "Exception: out of bounds memory access");
  441. argv[0] = end2;
  442. argv[1] = 98;
  443. argv[2] = 2;
  444. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  445. "test_bulk_memory_chain.aot",
  446. "memory_fill_test", 3, argv),
  447. "Exception: out of bounds memory access");
  448. argv[0] = start1;
  449. argv[1] = 98;
  450. argv[2] = BUF_SIZE + 1;
  451. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  452. "test_bulk_memory_chain.aot",
  453. "memory_fill_test", 3, argv),
  454. "Exception: out of bounds memory access");
  455. argv[0] = start2;
  456. argv[1] = 98;
  457. argv[2] = BUF_SIZE + 1;
  458. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  459. "test_bulk_memory_chain.aot",
  460. "memory_fill_test", 3, argv),
  461. "Exception: out of bounds memory access");
  462. }
  463. TEST_F(shared_heap_test, test_shared_heap_rmw_oob)
  464. {
  465. WASMSharedHeap *shared_heap = nullptr;
  466. uint32 argv[2] = { 0 }, BUF_SIZE = os_getpagesize();
  467. uint8 preallocated_buf[BUF_SIZE], preallocated_buf2[BUF_SIZE];
  468. uint32 start1, end1, start2, end2;
  469. create_test_shared_heap(preallocated_buf, BUF_SIZE, &shared_heap);
  470. /* app addr for shared heap */
  471. start1 = UINT32_MAX - BUF_SIZE + 1;
  472. end1 = UINT32_MAX;
  473. /* try to rmw an u16, first u8 is in the first shared heap and second u8 is
  474. * in the second shared heap, will be seen as oob */
  475. argv[0] = end1;
  476. argv[1] = 12025;
  477. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap, "test.wasm",
  478. "read_modify_write_16", 2, argv),
  479. "Exception: out of bounds memory access");
  480. argv[0] = start1 - 1;
  481. argv[1] = 12025;
  482. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap, "test.aot",
  483. "read_modify_write_16", 2, argv),
  484. "Exception: out of bounds memory access");
  485. argv[0] = end1;
  486. argv[1] = 12025;
  487. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap, "test.aot",
  488. "read_modify_write_16", 2, argv),
  489. "Exception: out of bounds memory access");
  490. }
  491. TEST_F(shared_heap_test, test_shared_heap_chain_rmw_oob)
  492. {
  493. WASMSharedHeap *shared_heap_chain = nullptr;
  494. uint32 argv[2] = { 0 }, BUF_SIZE = os_getpagesize();
  495. uint8 preallocated_buf[BUF_SIZE], preallocated_buf2[BUF_SIZE];
  496. uint32 start1, end1, start2, end2;
  497. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  498. BUF_SIZE, &shared_heap_chain);
  499. /* app addr for shared heap */
  500. start1 = UINT32_MAX - 2 * BUF_SIZE + 1;
  501. end1 = UINT32_MAX - BUF_SIZE;
  502. start2 = UINT32_MAX - BUF_SIZE + 1;
  503. end2 = UINT32_MAX;
  504. /* try to rmw an u16, first u8 is in the first shared heap and second u8 is
  505. * in the second shared heap, will be seen as oob */
  506. argv[0] = end2;
  507. argv[1] = 12025;
  508. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain, "test.wasm",
  509. "read_modify_write_16", 2, argv),
  510. "Exception: out of bounds memory access");
  511. argv[0] = end1;
  512. argv[1] = 12025;
  513. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  514. "test_chain.aot",
  515. "read_modify_write_16", 2, argv),
  516. "Exception: out of bounds memory access");
  517. }
  518. #if WASM_ENABLE_MEMORY64 != 0
  519. TEST_F(shared_heap_test, test_shared_heap_chain_memory64_rmw)
  520. {
  521. WASMSharedHeap *shared_heap_chain = nullptr;
  522. uint32 argv[3] = { 0 }, BUF_SIZE = os_getpagesize();
  523. uint8 preallocated_buf[BUF_SIZE] = { 0 },
  524. preallocated_buf2[BUF_SIZE] = { 0 };
  525. uint64 start1, end1, start2, end2;
  526. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  527. BUF_SIZE, &shared_heap_chain);
  528. /* app addr for shared heap */
  529. start1 = UINT64_MAX - 2 * BUF_SIZE + 1;
  530. end1 = UINT64_MAX - BUF_SIZE;
  531. start2 = UINT64_MAX - BUF_SIZE + 1;
  532. end2 = UINT64_MAX;
  533. /* shared heap 1 */
  534. PUT_I64_TO_ADDR(argv, end1);
  535. argv[2] = 101;
  536. test_shared_heap(shared_heap_chain, "test64.wasm", "read_modify_write_8", 3,
  537. argv);
  538. EXPECT_EQ(0, argv[0]);
  539. EXPECT_EQ(preallocated_buf[BUF_SIZE - 1], 101);
  540. /* shared heap 2 */
  541. PUT_I64_TO_ADDR(argv, start2);
  542. argv[2] = 129;
  543. test_shared_heap(shared_heap_chain, "test64.wasm", "read_modify_write_8", 3,
  544. argv);
  545. EXPECT_EQ(0, argv[0]);
  546. EXPECT_EQ(preallocated_buf2[0], 129);
  547. PUT_I64_TO_ADDR(argv, start1);
  548. argv[2] = 98;
  549. test_shared_heap(shared_heap_chain, "test64_chain.aot",
  550. "read_modify_write_8", 3, argv);
  551. EXPECT_EQ(0, argv[0]);
  552. EXPECT_EQ(preallocated_buf[0], 98);
  553. PUT_I64_TO_ADDR(argv, end2);
  554. argv[2] = 81;
  555. test_shared_heap(shared_heap_chain, "test64_chain.aot",
  556. "read_modify_write_8", 3, argv);
  557. EXPECT_EQ(0, argv[0]);
  558. EXPECT_EQ(preallocated_buf2[BUF_SIZE - 1], 81);
  559. }
  560. TEST_F(shared_heap_test, test_shared_heap_chain_memory64_rmw_oob)
  561. {
  562. WASMSharedHeap *shared_heap_chain = nullptr;
  563. uint32 argv[3] = { 0 }, BUF_SIZE = os_getpagesize();
  564. uint8 preallocated_buf[BUF_SIZE], preallocated_buf2[BUF_SIZE];
  565. uint64 start1, end1, start2, end2;
  566. create_test_shared_heap_chain(preallocated_buf, BUF_SIZE, preallocated_buf2,
  567. BUF_SIZE, &shared_heap_chain);
  568. /* app addr for shared heap */
  569. start1 = UINT64_MAX - 2 * BUF_SIZE + 1;
  570. end1 = UINT64_MAX - BUF_SIZE;
  571. start2 = UINT64_MAX - BUF_SIZE + 1;
  572. end2 = UINT64_MAX;
  573. /* try to rmw an u16, first u8 is in the first shared heap and second u8 is
  574. * in the second shared heap, will be seen as oob */
  575. PUT_I64_TO_ADDR(argv, end1);
  576. argv[2] = 12025;
  577. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain, "test64.wasm",
  578. "read_modify_write_16", 3, argv),
  579. "Exception: out of bounds memory access");
  580. PUT_I64_TO_ADDR(argv, end1);
  581. argv[2] = 12025;
  582. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  583. "test64_chain.aot",
  584. "read_modify_write_16", 3, argv),
  585. "Exception: out of bounds memory access");
  586. }
  587. #endif
  588. #ifndef native_function
  589. /* clang-format off */
  590. #define native_function(func_name, signature) \
  591. { #func_name, (void *)glue_## func_name, signature, NULL }
  592. /* clang-format on */
  593. #endif
  594. #ifndef nitems
  595. #define nitems(_a) (sizeof(_a) / sizeof(0 [(_a)]))
  596. #endif /* nitems */
  597. uintptr_t
  598. glue_test_addr_conv(wasm_exec_env_t env, uintptr_t addr)
  599. {
  600. wasm_module_inst_t module_inst = get_module_inst(env);
  601. void *native_addr = (void *)addr;
  602. uintptr_t app_addr = addr_native_to_app(native_addr);
  603. native_addr = addr_app_to_native(app_addr);
  604. if (native_addr != (void *)addr) {
  605. ADD_FAILURE() << "address conversion incorrect";
  606. return 0;
  607. }
  608. return app_addr;
  609. }
  610. static NativeSymbol g_test_native_symbols[] = {
  611. native_function(test_addr_conv, "(*)i"),
  612. };
  613. TEST_F(shared_heap_test, test_addr_conv)
  614. {
  615. SharedHeapInitArgs args = { 0 };
  616. WASMSharedHeap *shared_heap = nullptr;
  617. uint32 argv[1] = { 0 };
  618. bool ret = false;
  619. ret = wasm_native_register_natives("env", g_test_native_symbols,
  620. nitems(g_test_native_symbols));
  621. if (!ret) {
  622. FAIL() << "Failed to register natives";
  623. }
  624. args.size = 1024;
  625. shared_heap = wasm_runtime_create_shared_heap(&args);
  626. if (!shared_heap) {
  627. FAIL() << "Failed to create shared heap";
  628. }
  629. test_shared_heap(shared_heap, "test_addr_conv.wasm", "test", 0, argv);
  630. EXPECT_EQ(1, argv[0]);
  631. test_shared_heap(shared_heap, "test_addr_conv.aot", "test", 0, argv);
  632. EXPECT_EQ(1, argv[0]);
  633. test_shared_heap(shared_heap, "test_addr_conv_chain.aot", "test", 0, argv);
  634. EXPECT_EQ(1, argv[0]);
  635. }
  636. TEST_F(shared_heap_test, test_addr_conv_pre_allocated_oob)
  637. {
  638. SharedHeapInitArgs args = { 0 };
  639. WASMSharedHeap *shared_heap = nullptr;
  640. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize(),
  641. app_addr = 0xFFFFFFFF - BUF_SIZE;
  642. uint8 preallocated_buf[BUF_SIZE];
  643. bool ret = false;
  644. /* create a preallocated shared heap */
  645. ret = wasm_native_register_natives("env", g_test_native_symbols,
  646. nitems(g_test_native_symbols));
  647. if (!ret) {
  648. FAIL() << "Failed to register natives";
  649. }
  650. args.pre_allocated_addr = preallocated_buf;
  651. args.size = BUF_SIZE;
  652. shared_heap = wasm_runtime_create_shared_heap(&args);
  653. if (!shared_heap) {
  654. FAIL() << "Failed to create shared heap";
  655. }
  656. argv[0] = app_addr;
  657. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap, "test_addr_conv.wasm",
  658. "test_preallocated", 1, argv),
  659. "Exception: out of bounds memory access");
  660. argv[0] = app_addr;
  661. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap, "test_addr_conv.aot",
  662. "test_preallocated", 1, argv),
  663. "Exception: out of bounds memory access");
  664. argv[0] = app_addr;
  665. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap,
  666. "test_addr_conv_chain.aot",
  667. "test_preallocated", 1, argv),
  668. "Exception: out of bounds memory access");
  669. }
  670. TEST_F(shared_heap_test, test_shared_heap_chain)
  671. {
  672. SharedHeapInitArgs args = { 0 };
  673. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  674. *shared_heap_chain = nullptr;
  675. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  676. uint8 preallocated_buf[BUF_SIZE];
  677. bool ret = false;
  678. ret = wasm_native_register_natives("env", g_test_native_symbols,
  679. nitems(g_test_native_symbols));
  680. if (!ret) {
  681. FAIL() << "Failed to register natives";
  682. }
  683. args.size = 1024;
  684. shared_heap = wasm_runtime_create_shared_heap(&args);
  685. if (!shared_heap) {
  686. FAIL() << "Failed to create shared heap";
  687. }
  688. /* create a preallocated shared heap */
  689. memset(&args, 0, sizeof(args));
  690. args.pre_allocated_addr = preallocated_buf;
  691. args.size = BUF_SIZE;
  692. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  693. if (!shared_heap2) {
  694. FAIL() << "Create preallocated shared heap failed.\n";
  695. }
  696. shared_heap_chain =
  697. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  698. if (!shared_heap_chain) {
  699. FAIL() << "Create shared heap chain failed.\n";
  700. }
  701. test_shared_heap(shared_heap_chain, "test_addr_conv.wasm", "test", 0, argv);
  702. EXPECT_EQ(1, argv[0]);
  703. test_shared_heap(shared_heap, "test_addr_conv.aot", "test", 0, argv);
  704. EXPECT_EQ(1, argv[0]);
  705. }
  706. TEST_F(shared_heap_test, test_shared_heap_chain_create_fail)
  707. {
  708. SharedHeapInitArgs args = { 0 };
  709. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  710. *shared_heap_chain = nullptr;
  711. args.size = 1024;
  712. shared_heap = wasm_runtime_create_shared_heap(&args);
  713. if (!shared_heap) {
  714. FAIL() << "Failed to create shared heap";
  715. }
  716. args.size = 4096;
  717. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  718. if (!shared_heap2) {
  719. FAIL() << "Create preallocated shared heap failed.\n";
  720. }
  721. shared_heap_chain =
  722. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  723. EXPECT_EQ(shared_heap_chain, nullptr);
  724. }
  725. TEST_F(shared_heap_test, test_shared_heap_chain_create_fail2)
  726. {
  727. SharedHeapInitArgs args = { 0 };
  728. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  729. *shared_heap_chain = nullptr;
  730. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  731. uint8 preallocated_buf[BUF_SIZE];
  732. struct ret_env tmp_module_env;
  733. args.size = 1024;
  734. shared_heap = wasm_runtime_create_shared_heap(&args);
  735. if (!shared_heap) {
  736. FAIL() << "Failed to create shared heap";
  737. }
  738. memset(&args, 0, sizeof(args));
  739. args.pre_allocated_addr = preallocated_buf;
  740. args.size = BUF_SIZE;
  741. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  742. if (!shared_heap2) {
  743. FAIL() << "Create preallocated shared heap failed.\n";
  744. }
  745. if (!load_wasm((char *)"test.wasm", 0, tmp_module_env)) {
  746. FAIL() << "Failed to load wasm file\n";
  747. }
  748. if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst,
  749. shared_heap)) {
  750. FAIL() << "Failed to attach shared heap\n";
  751. }
  752. /* can't create shared heap chain when shared heap is attached to a wasm
  753. * app */
  754. shared_heap_chain =
  755. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  756. EXPECT_EQ(shared_heap_chain, nullptr);
  757. wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst);
  758. destroy_module_env(tmp_module_env);
  759. }
  760. TEST_F(shared_heap_test, test_shared_heap_chain_create_fail3)
  761. {
  762. SharedHeapInitArgs args = { 0 };
  763. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  764. *shared_heap3 = nullptr, *shared_heap_chain = nullptr;
  765. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  766. uint8 preallocated_buf[BUF_SIZE], preallocated_buf2[BUF_SIZE];
  767. args.size = 1024;
  768. shared_heap = wasm_runtime_create_shared_heap(&args);
  769. if (!shared_heap) {
  770. FAIL() << "Failed to create shared heap";
  771. }
  772. memset(&args, 0, sizeof(args));
  773. args.pre_allocated_addr = preallocated_buf;
  774. args.size = BUF_SIZE;
  775. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  776. if (!shared_heap2) {
  777. FAIL() << "Create preallocated shared heap failed.\n";
  778. }
  779. shared_heap_chain =
  780. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  781. if (!shared_heap_chain) {
  782. FAIL() << "Create shared heap chain failed.\n";
  783. }
  784. memset(&args, 0, sizeof(args));
  785. args.pre_allocated_addr = preallocated_buf2;
  786. args.size = BUF_SIZE;
  787. shared_heap3 = wasm_runtime_create_shared_heap(&args);
  788. if (!shared_heap3) {
  789. FAIL() << "Failed to create shared heap";
  790. }
  791. /* The head and body can't be already in other shared heap chain as body */
  792. shared_heap_chain =
  793. wasm_runtime_chain_shared_heaps(shared_heap3, shared_heap2);
  794. EXPECT_EQ(shared_heap_chain, nullptr);
  795. shared_heap_chain =
  796. wasm_runtime_chain_shared_heaps(shared_heap2, shared_heap);
  797. EXPECT_EQ(shared_heap_chain, nullptr);
  798. }
  799. TEST_F(shared_heap_test, test_shared_heap_chain_unchain)
  800. {
  801. SharedHeapInitArgs args = { 0 };
  802. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  803. *shared_heap3 = nullptr, *shared_heap_chain = nullptr;
  804. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  805. uint8 preallocated_buf[BUF_SIZE], preallocated_buf2[BUF_SIZE];
  806. args.size = 1024;
  807. shared_heap = wasm_runtime_create_shared_heap(&args);
  808. if (!shared_heap) {
  809. FAIL() << "Failed to create shared heap";
  810. }
  811. memset(&args, 0, sizeof(args));
  812. args.pre_allocated_addr = preallocated_buf;
  813. args.size = BUF_SIZE;
  814. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  815. if (!shared_heap2) {
  816. FAIL() << "Create preallocated shared heap failed.\n";
  817. }
  818. shared_heap_chain =
  819. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  820. if (!shared_heap_chain) {
  821. FAIL() << "Create shared heap chain failed.\n";
  822. }
  823. memset(&args, 0, sizeof(args));
  824. args.pre_allocated_addr = preallocated_buf2;
  825. args.size = BUF_SIZE;
  826. shared_heap3 = wasm_runtime_create_shared_heap(&args);
  827. if (!shared_heap3) {
  828. FAIL() << "Failed to create shared heap";
  829. }
  830. /* unchain shared heap so that the 'body' can be another chain 'body'
  831. * again(1->2 to 1->3->2) */
  832. EXPECT_EQ(shared_heap2,
  833. wasm_runtime_unchain_shared_heaps(shared_heap_chain, false));
  834. shared_heap_chain =
  835. wasm_runtime_chain_shared_heaps(shared_heap3, shared_heap2);
  836. EXPECT_EQ(shared_heap_chain, shared_heap3);
  837. shared_heap_chain =
  838. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap3);
  839. EXPECT_EQ(shared_heap, shared_heap_chain);
  840. /* break down the entire shared heap chain */
  841. EXPECT_EQ(shared_heap2,
  842. wasm_runtime_unchain_shared_heaps(shared_heap_chain, true));
  843. }
  844. TEST_F(shared_heap_test, test_shared_heap_chain_addr_conv)
  845. {
  846. SharedHeapInitArgs args = { 0 };
  847. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  848. *shared_heap_chain = nullptr;
  849. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  850. uint8 preallocated_buf[BUF_SIZE];
  851. bool ret = false;
  852. ret = wasm_native_register_natives("env", g_test_native_symbols,
  853. nitems(g_test_native_symbols));
  854. if (!ret) {
  855. FAIL() << "Failed to register natives";
  856. }
  857. args.size = 4096;
  858. shared_heap = wasm_runtime_create_shared_heap(&args);
  859. if (!shared_heap) {
  860. FAIL() << "Failed to create shared heap";
  861. }
  862. /* create a preallocated shared heap */
  863. memset(&args, 0, sizeof(args));
  864. args.pre_allocated_addr = preallocated_buf;
  865. args.size = BUF_SIZE;
  866. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  867. if (!shared_heap2) {
  868. FAIL() << "Create preallocated shared heap failed.\n";
  869. }
  870. shared_heap_chain =
  871. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  872. if (!shared_heap_chain) {
  873. FAIL() << "Create shared heap chain failed.\n";
  874. }
  875. argv[0] = 0xFFFFFFFF;
  876. test_shared_heap(shared_heap_chain, "test_addr_conv.wasm",
  877. "test_preallocated", 1, argv);
  878. EXPECT_EQ(1, argv[0]);
  879. argv[0] = 0xFFFFF000;
  880. test_shared_heap(shared_heap_chain, "test_addr_conv.wasm",
  881. "test_preallocated", 1, argv);
  882. EXPECT_EQ(1, argv[0]);
  883. argv[0] = 0xFFFFFFFF;
  884. test_shared_heap(shared_heap, "test_addr_conv_chain.aot",
  885. "test_preallocated", 1, argv);
  886. EXPECT_EQ(1, argv[0]);
  887. argv[0] = 0xFFFFF000;
  888. test_shared_heap(shared_heap, "test_addr_conv_chain.aot",
  889. "test_preallocated", 1, argv);
  890. EXPECT_EQ(1, argv[0]);
  891. }
  892. TEST_F(shared_heap_test, test_shared_heap_chain_addr_conv_oob)
  893. {
  894. SharedHeapInitArgs args = { 0 };
  895. WASMSharedHeap *shared_heap = nullptr, *shared_heap2 = nullptr,
  896. *shared_heap_chain = nullptr;
  897. uint32 argv[1] = { 0 }, BUF_SIZE = os_getpagesize();
  898. uint8 preallocated_buf[BUF_SIZE];
  899. bool ret = false;
  900. ret = wasm_native_register_natives("env", g_test_native_symbols,
  901. nitems(g_test_native_symbols));
  902. if (!ret) {
  903. FAIL() << "Failed to register natives";
  904. }
  905. args.size = 4096;
  906. shared_heap = wasm_runtime_create_shared_heap(&args);
  907. if (!shared_heap) {
  908. FAIL() << "Failed to create shared heap";
  909. }
  910. /* create a preallocated shared heap */
  911. memset(&args, 0, sizeof(args));
  912. args.pre_allocated_addr = preallocated_buf;
  913. args.size = BUF_SIZE;
  914. shared_heap2 = wasm_runtime_create_shared_heap(&args);
  915. if (!shared_heap2) {
  916. FAIL() << "Create preallocated shared heap failed.\n";
  917. }
  918. shared_heap_chain =
  919. wasm_runtime_chain_shared_heaps(shared_heap, shared_heap2);
  920. if (!shared_heap_chain) {
  921. FAIL() << "Create shared heap chain failed.\n";
  922. }
  923. /* test wasm */
  924. argv[0] = 0xFFFFFFFF - BUF_SIZE - 4096;
  925. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  926. "test_addr_conv.wasm",
  927. "test_preallocated", 1, argv),
  928. "Exception: out of bounds memory access");
  929. /* test aot */
  930. argv[0] = 0xFFFFFFFF - BUF_SIZE - 4096;
  931. EXPECT_NONFATAL_FAILURE(test_shared_heap(shared_heap_chain,
  932. "test_addr_conv_chain.aot",
  933. "test_preallocated", 1, argv),
  934. "Exception: out of bounds memory access");
  935. }