← Back to context

Comment by vincent-uden

11 days ago

What the hell. This is not the esoteric, crazy, impractical constellation I expected to find with a title like this. The minimal example is so simple and is definitely something you'd easily come across in normal code.

For a long time `loop {}` was undefined behavior. Lots of l-unsounds are really nuts but a few are not.

The reality is that if this were actually code that people wrote, well, it wouldn't have sat around for a decade.

  • Afaik loop {} has never been UB, however because llvm started as a c++ compiled where it is, this has been causing miscompilations in rust and C for… nearly two decades (llvm issue 965).

> is definitely something you'd easily come across in normal code.

The fact that nobody reported this before means it's not, by definition.

  • Not at all. There are way more valid lifetimes than the lifetime system of Rust can express. There are countless scenarios where you could accidentally use the unsound behaviour while not producing a segmentation fault because the lifetimes happens to be arranged such that no invalid memory access actually happened.

    A program isn't invalid just because it violates the ownership and borrowing rules of Rust. There are tons of programs in the world with shared, mutable access, devoid of Mutexes, Arcs and Locks that nonetheless are completely valid.

I wonder if the reason it works is because you'd easily come across it in normal code, and someone didn't realize that saving the effort of implementing a check for this would result in unsoundness.

  • That's not how it works. rustc doesn't "check" for specific cases explicitly, the borrow checker (apparently at fault here by reports) has a set of rules that should reject invalid programs. So either one of the fundamental rules was broken (unlikely here from what I've heard), or some optimization caused the rules to not be implemented correctly.

    • I know the borrow checker uses rules, but I don't know enough about the internal implementation details to use fully precise terminology. I don't mean borrow checking is just a chain of if-statements or something. I meant check in the abstract.

      From the GitHub thread: "I think unification just generally doesn't check lifetime bounds of the type." [0]

      There are steps, or rules or whatever, that perform soundness (or well-formedness or whatever) checks. And clearly one was missing.

      My guess was just that maybe someone didn't think it was necessary for soundness.

      [0]: https://github.com/rust-lang/rust/issues/164250#issuecomment...

Not really. I've worked with rust for 4 years, systems side, and never had to write a custom drop implementation. That's the gotcha here, not the rigamarole with the static+Send option type (which _would_ be something you'd encounter in prod).

  • I've written dozens of custom Drop implementations. Well, many of them are named cleanup because of the async Drop mess in Rust, but...

  • A custom `Drop` appears very quickly with FFI code. Suppose for example you interface with some C library that expects you to call a function to release some resources.

  • That's easily the exception rather than the rule. I've seen custom `Drop` implementations in almost every non-trivial Rust codebase I worked on.

  • Now we are at the phase where, Rust is “safe” but only if you use it “correctly” and without using X language feature or a custom Y feature.

    This is the problem when a language advertises with “guarantees” and it turns out it never had any due to many false assumptions by their promoters.

    So what other soundness bugs are there in the language that we need to know about?

    • No we're in a situation where a bug in the type checker was found and will be fixed and a new release will be made.

      That it took 11 years for someone to come across this is a fairly intense counterargument to your attempt to paint this as a language with dangerous footguns.

      8 replies →

    • I'm not defending rust here - a correctness bug invalidates the premise. But I am saying that I've never seen a custom drop in production.

      For some reason this is controversial, but it remains true.

      2 replies →