Skip to content

[Wasm Exceptions] Crash in scan_eh_tab() #13548

@kripken

Description

@kripken

STR:

#include <stdio.h> // avoid iostream C++ code, just test libc++abi, not libc++
#include <stdint.h>

const int INIIAL_FUEL = 100;

static int fuel = INIIAL_FUEL;

void refuel() {
  fuel = INIIAL_FUEL;
}

// TODO random data
static bool boolean = true;

bool getBoolean() {
  // If we are done, exit all loops etc.
  if (fuel == 0) {
    return false;
  }
  fuel--;
  boolean = !boolean;
  return boolean;
}

struct Class {
  Class();
  ~Class();
};

Class::Class() {
  puts("class-instance");
}

Class::~Class() {
  puts("~class-instance");
}

void func_0() {
  try {
    throw 0;
  } catch (Class) {
  }
}

void func_1() {
  try {
    throw 0;
  } catch (int32_t) {
    try {
      func_0();
    } catch (int32_t) {
    }
  }
}

int main() {
  // func_0
  puts("calling func_0");
  refuel();
  try {
    func_0();
  } catch (...) {
    puts("main caught from func_0");
  }
  // func_1
  puts("calling func_1");
  refuel();
  try {
    func_1();
  } catch (...) {
    puts("main caught from func_1");
  }
  return 0;
}
em++ a.cpp -fwasm-exceptions -s WASM_BIGINT -g
v8 --experimental-wasm-eh a.out.js

-g is useful for the stack trace, but not necessary to get a runtime error. The trace is

calling func_0
main caught from func_0
calling func_1
exception thrown: RuntimeError: unreachable,RuntimeError: unreachable
    at abort_message (<anonymous>:wasm-function[14]:0x7fc)
    at demangling_terminate_handler() (<anonymous>:wasm-function[15]:0x8c5)
    at std::__terminate(void (*)()) (<anonymous>:wasm-function[22]:0xa10)
    at __cxxabiv1::call_terminate(bool, _Unwind_Exception*) (<anonymous>:wasm-function[80]:0x1efb)
    at __cxxabiv1::scan_eh_tab(__cxxabiv1::(anonymous namespace)::scan_results&, _Unwind_Action, bool, _Unwind_Exception*, _Unwind_Context*) (<anonymous>:wasm-function[78]:0x1eae)
    at __gxx_personality_wasm0 (<anonymous>:wasm-function[77]:0x19f4)
    at _Unwind_CallPersonality (<anonymous>:wasm-function[94]:0x2330)
    at func_1() (<anonymous>:wasm-function[9]:0x5b9)
    at __original_main (<anonymous>:wasm-function[10]:0x733)
    at main (<anonymous>:wasm-function[11]:0x7dc)

Tested on the #13485 branch where this was found, which skips building libc++ - perhaps that is related?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions