Samsung / walrus

WebAssembly Lightweight RUntime
Apache License 2.0
35 stars 10 forks source link

Variable not cleared #242

Open zherczeg opened 2 months ago

zherczeg commented 2 months ago

Test case:

(func (export "test10") (param i32) (result i32) (local i32).
   local.get 0
   if
     local.get 0
     i32.const 6
     i32.div_s
     local.set 1
   end

   local.get 1
)

Byte code dump:

     0 const32 dstOffset: 16 value: 6
    16 jump_if_false srcOffset: 0 dst: 48
    32 I32DivS src1: 0 src2: 16 dst: 8
    48 end resultOffsets: 8

It seems local 1 is not set to zero, and the function may return with garbage.

kulcsaradam commented 1 week ago

Just so it does not get overlooked this is also present with br_table.

For example this code:

(func (export "f6") (param i32 ) (result i32)
  (local i32)

  (block $end
    (block
      (block
        local.get 0
        (br_table 0 1 2)
      )

      i32.const 1
      local.tee 1

      return
    )
    i32.const 2
    local.set 1
  )

  local.get 1
)

Local 1 should be initialized to zero but it is not.