Browse Source

Appease some UBSan complaints (#720)

YAMAMOTO Takashi 4 years ago
parent
commit
79f163d08b
2 changed files with 25 additions and 19 deletions
  1. 20 19
      core/iwasm/interpreter/wasm_loader.c
  2. 5 0
      core/shared/platform/include/platform_common.h

+ 20 - 19
core/iwasm/interpreter/wasm_loader.c

@@ -8580,26 +8580,27 @@ unsupported_opcode:
         goto re_scan;
 
     func->const_cell_num = loader_ctx->const_cell_num;
-    if (func->const_cell_num > 0
-        && !(func->consts = func_const =
+    if (func->const_cell_num > 0) {
+        if (!(func->consts = func_const =
                 loader_malloc(func->const_cell_num * 4,
-                              error_buf, error_buf_size))) {
-        goto fail;
-    }
-    func_const_end = func->consts + func->const_cell_num * 4;
-    /* reverse the const buf */
-    for (int i = loader_ctx->num_const - 1; i >= 0; i--) {
-        Const *c = (Const*)(loader_ctx->const_buf + i * sizeof(Const));
-        if (c->value_type == VALUE_TYPE_F64
-            || c->value_type == VALUE_TYPE_I64) {
-            bh_memcpy_s(func_const, (uint32)(func_const_end - func_const),
-                        &(c->value.f64), (uint32)sizeof(int64));
-            func_const += sizeof(int64);
-        }
-        else {
-            bh_memcpy_s(func_const, (uint32)(func_const_end - func_const),
-                        &(c->value.f32), (uint32)sizeof(int32));
-            func_const += sizeof(int32);
+                              error_buf, error_buf_size)))
+            goto fail;
+
+        func_const_end = func->consts + func->const_cell_num * 4;
+        /* reverse the const buf */
+        for (int i = loader_ctx->num_const - 1; i >= 0; i--) {
+            Const *c = (Const*)(loader_ctx->const_buf + i * sizeof(Const));
+            if (c->value_type == VALUE_TYPE_F64
+                || c->value_type == VALUE_TYPE_I64) {
+                bh_memcpy_s(func_const, (uint32)(func_const_end - func_const),
+                            &(c->value.f64), (uint32)sizeof(int64));
+                func_const += sizeof(int64);
+            }
+            else {
+                bh_memcpy_s(func_const, (uint32)(func_const_end - func_const),
+                            &(c->value.f32), (uint32)sizeof(int32));
+                func_const += sizeof(int32);
+            }
         }
     }
 

+ 5 - 0
core/shared/platform/include/platform_common.h

@@ -80,8 +80,13 @@ int BH_VPRINTF(const char *format, va_list ap);
 
 /* Return the offset of the given field in the given type */
 #ifndef offsetof
+/* GCC 4.0 and later has the builtin. */
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define offsetof(Type, field) __builtin_offsetof(Type, field)
+#else
 #define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
 #endif
+#endif
 
 typedef uint8_t uint8;
 typedef int8_t int8;