Skip to content

Stack overflow when displaying the derivation tree #293

@x-hgg-x

Description

@x-hgg-x

When importing in pubgrub the cargo test from https://github.com/rust-lang/cargo/blob/bf79c8b154fa6b3e4d781c26935429948cbd9b2b/crates/resolver-tests/tests/resolve.rs#L529, I get a stack overflow in the test when displaying the derivation tree:

#[test]
fn resolving_with_constrained_cousins_backtrack() {
    const DEPTH: u32 = 100;
    const BRANCHING_FACTOR: u32 = 50;

    let mut dependency_provider =
        OfflineDependencyProvider::<String, Ranges<SemanticVersion>>::new();

    let root_deps = [
        ("backtrack_trap_v0_0".into(), Ranges::full()),
        ("cloaking".into(), Ranges::full()),
    ];
    dependency_provider.add_dependencies("root".into(), (0, 0, 0), root_deps);

    dependency_provider.add_dependencies(
        "cloaking".into(),
        (0, 0, 0),
        [("constrained".into(), Ranges::between((1, 0, 0), (1, 1, 0)))],
    );

    for v in 1..BRANCHING_FACTOR + 10 {
        dependency_provider.add_dependencies("constrained".into(), (1, 0, v), []);
    }
    dependency_provider.add_dependencies("constrained".into(), (1, 1, 0), []);

    for n in 0..DEPTH {
        for v in 1..BRANCHING_FACTOR {
            let v = (1, 0, v);
            dependency_provider.add_dependencies(
                format!("backtrack_trap_v0_{n}"),
                v,
                [(format!("backtrack_trap_v1_{n}"), Ranges::singleton(v))],
            );
            dependency_provider.add_dependencies(
                format!("backtrack_trap_v1_{n}"),
                v,
                [(format!("backtrack_trap_v2_{n}"), Ranges::singleton(v))],
            );
            dependency_provider.add_dependencies(
                format!("backtrack_trap_v2_{n}"),
                v,
                [(format!("backtrack_trap_v0_{}", n + 1), Ranges::full())],
            );
        }
    }
    for v in 1..BRANCHING_FACTOR {
        let v = (1, 0, v);
        dependency_provider.add_dependencies(
            format!("backtrack_trap_v0_{DEPTH}"),
            v,
            [("constrained".into(), Ranges::between((1, 1, 0), (2, 0, 0)))],
        );
    }

    let res = pubgrub::resolve(&dependency_provider, "root".into(), (0, 0, 0));

    if let Err(PubGrubError::NoSolution(error)) = res {
        // Stack overflow here
        let _out = format!("{error:?}");
        let _out = DefaultStringReporter::report(&error).to_string();
    };
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions