lazy-static.rs icon indicating copy to clipboard operation
lazy-static.rs copied to clipboard

Unexpected stack overflow when initializing array

Open camilchp opened this issue 2 years ago • 2 comments

The following code generates a stack overflow, despite containing no explicitly recursive code.

extern crate lazy_static; // 1.4.0

use lazy_static::lazy_static;

const SIZE : usize = 1_000_000;
const U0 : usize = 0;

fn u_gen() -> [usize;SIZE] {

        let mut u = [U0;SIZE];
        for i in 1..SIZE {
            u[i] = (u[i-1] + 1) % 10;
        } 
        u
}
 
lazy_static! {
    static ref U : [usize;SIZE] = u_gen();
}


fn main() {
    dbg!((*U)[0]);
    //dbg!(u_gen()[0]);
}

playground link On my laptop, the stack overflow occurs in Debug mode, but not in Release mode.

On the playground, on the other hand, I get a stack overflow in both modes.

The problem only occurs when u_gen is called in lazy_static. When calling it directly (see commented line in main), everything goes fine.

cc @pchampin

camilchp avatar Aug 11 '22 17:08 camilchp

That is a big array to be on the stack. I'm experiencing the same problem with a smaller one though (80Kb).

I'm not sure if lazy_static boxes the value but before that I think it creates it on the stack, and it makes copies of it.

JosuGZ avatar Aug 30 '22 11:08 JosuGZ

Agreed, such a big array on the stack may not be ideal. But the fact that it works without lazy_static and fails with it makes it a bug, regardless.

pchampin avatar Aug 30 '22 12:08 pchampin