Skip to content

StackOverflow error when assert fails or panic when compiling to Android #116309

Open
@matan-h

Description

When I compile Rust Library to Android (using this or this tutorial), all works fine, except if my code panic!, or an assert fails: in this case, the app crashes.

Here is example code (based on this tutorial, so the example function name is Cryptor_decrypt in com.fernandocejas.sample package)

#[cfg(target_os = "android")]
#[allow(non_snake_case)]
pub mod android {
    extern crate jni;

    // This is the interface to the JVM 
    // that we'll call the majority of our
    // methods on.
    // @See https://docs.rs/jni/latest/jni/
    use self::jni::JNIEnv;

    // These objects are what you should use as arguments to your 
    // native function. They carry extra lifetime information to 
    // prevent them escaping this context and getting used after 
    // being GC'd.
    use self::jni::objects::{JClass, JString};

    // This is just a pointer. We'll be returning it from our function. 
    // We can't return one of the objects with lifetime information 
    // because the lifetime checker won't let us.
    use self::jni::sys::jstring;
    #[no_mangle] // This keeps Rust from "mangling" the name so it is unique (crate).
    pub extern "system" fn Java_com_fernandocejas_rust_Cryptor_decrypt<'local>(
        mut _env: JNIEnv<'local>,
        // This is the class that owns our static method. It's not going to be used,
        // but still must be present to match the expected signature of a static
        // native method.        
        _class: JClass<'local>,
        _input: JString<'local>,
    ) -> jstring { panic!("Normal panic");}
}   

I expected to see this happen: the rust library would show the panic! output on the logcat

Instead, this happened: the panic caused assertion failure inside the panic handler, which causes the code to panic again, which triggers the assertion again, and so on until the stack overflows. you can see it in the android logcat

Meta

rustc --version --verbose:

rustc 1.72.1 (d5c2e9c34 2023-09-13)
binary: rustc
commit-hash: d5c2e9c342b358556da91d61ed4133f6f50fc0c3
commit-date: 2023-09-13
host: x86_64-unknown-linux-gnu
release: 1.72.1
LLVM version: 16.0.5
Android logcat coredump

09-29 12:21:42.042 12824 12824 F DEBUG   : Build fingerprint: 'google/sdk_gphone64_x86_64/emu64:./UPB./.:userdebug/dev-keys'
09-29 12:21:42.042 12824 12824 F DEBUG   : Revision: '0'
09-29 12:21:42.042 12824 12824 F DEBUG   : ABI: 'x86_64'
09-29 12:21:42.042 12824 12824 F DEBUG   : Timestamp: 2023-09-29 12:21:24.093060911+0300
09-29 12:21:42.042 12824 12824 F DEBUG   : Process uptime: 75s
09-29 12:21:42.042 12824 12824 F DEBUG   : Cmdline: com.fernandocejas.sample
09-29 12:21:42.042 12824 12824 F DEBUG   : pid: 12686, tid: 12686, name: ndocejas.sample  >>> com.fernandocejas.sample <<<
09-29 12:21:42.042 12824 12824 F DEBUG   : uid: 10184
09-29 12:21:42.042 12824 12824 F DEBUG   : signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x00007ffd6fb4efe0
09-29 12:21:42.042 12824 12824 F DEBUG   : Cause: stack pointer is not in a rw map; likely due to stack overflow.
09-29 12:21:42.042 12824 12824 F DEBUG   :     rax 000000000000000b  rbx 00007250d1cc6610  rcx 00007ffd6fb4f0c8  rdx 00007250d1cbb8a0
09-29 12:21:42.042 12824 12824 F DEBUG   :     r8  00007250d1cbb8a0  r9  00007ffd6fb4f0d0  r10 00007ffd70334570  r11 43ceafaeb08abafe
09-29 12:21:42.042 12824 12824 F DEBUG   :     r12 00007250d1cbc810  r13 00007ffd6fb4f350  r14 00007250d1cbc428  r15 00007ffd6fb4f230
09-29 12:21:42.042 12824 12824 F DEBUG   :     rdi 0000000000000000  rsi 00007ffd6fb4f0c0
09-29 12:21:42.042 12824 12824 F DEBUG   :     rbp 00007ffd70336680  rsp 00007ffd6fb4efd0  rip 00007250d1c621c7
09-29 12:21:42.042 12824 12824 F DEBUG   : 512 total frames
09-29 12:21:42.042 12824 12824 F DEBUG   : backtrace:
09-29 12:21:42.042 12824 12824 F DEBUG   :       #00 pc 00000000009a71c7  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (core::panicking::assert_failed_inner::h9e15dd8f2a77db4c+7)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #01 pc 000000000096471a  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (core::panicking::assert_failed::h054aa0fe6cc26174+74)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #02 pc 0000000000985f2a  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::sys_common::thread_local_key::StaticKey::lazy_init::h5ff3cb4fbb7c6e28+170)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #03 pc 000000000099249d  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::panic_count::LOCAL_PANIC_COUNT::__getit::hc6f49f0edbdb42f3+45)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #04 pc 0000000000981d50  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::rust_panic_with_hook::hf31c0feb2c7da6b5+48)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #05 pc 0000000000981d06  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::begin_panic_handler::_$u7b$$u7b$closure$u7d$$u7d$::h185fdd4a7f50eafe+198)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #06 pc 0000000000980eb5  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::sys_common::backtrace::__rust_end_short_backtrace::h026667ccf492240b+5)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #07 pc 0000000000981a51  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (rust_begin_unwind+113)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #08 pc 00000000009a6f72  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (core::panicking::panic_fmt::h495b84bde03156a8+50)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #09 pc 00000000009a729a  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (core::panicking::assert_failed_inner::h9e15dd8f2a77db4c+218)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #10 pc 000000000096471a  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (core::panicking::assert_failed::h054aa0fe6cc26174+74)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #11 pc 0000000000985f2a  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::sys_common::thread_local_key::StaticKey::lazy_init::h5ff3cb4fbb7c6e28+170)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #12 pc 000000000099249d  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::panic_count::LOCAL_PANIC_COUNT::__getit::hc6f49f0edbdb42f3+45)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #13 pc 0000000000981d50  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::rust_panic_with_hook::hf31c0feb2c7da6b5+48)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #14 pc 0000000000981d06  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::panicking::begin_panic_handler::_$u7b$$u7b$closure$u7d$$u7d$::h185fdd4a7f50eafe+198)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #15 pc 0000000000980eb5  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (std::sys_common::backtrace::__rust_end_short_backtrace::h026667ccf492240b+5)
09-29 12:21:42.042 12824 12824 F DEBUG   :       #16 pc 0000000000981a51  /data/app/~~SJbaSy7U4-vmYK0dwRI07w==/com.fernandocejas.sample-c_MH_u093OUltZ57ZV7H6g==/base.apk (offset 0x5284000) (rust_begin_unwind+113)
...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-FFIArea: Foreign function interface (FFI)A-crossArea: Cross compilationA-panicArea: Panicking machineryC-bugCategory: This is a bug.O-androidOperating system: AndroidO-unixOperating system: Unix-likeO-x86_64Target: x86-64 processors (like x86_64-*)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions