Remix.run Logo
▲ vincent-uden 4 hours 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.

▲insanitybit 4 hours ago | parent | next [-]

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.

▲masklinn 2 hours ago | parent [-]

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).

▲cowlevel 2 hours ago | parent [-]

Since the Rust language is defined by the Rust compiler and has no other specification, if it's UB in the compiler then it's UB in the language.

▲masklinn 32 minutes ago | parent | next [-]

And this, kids, is how you get called Billy Madison.

May god have mercy on your soul, cowlevel1.

▲pmarreck 5 minutes ago | parent | prev [-]

Rust has no formal spec? Really?

▲fg137 3 hours ago | parent | prev | next [-]

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

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

▲vincent-uden 2 hours ago | parent [-]

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.

▲fg137 an hour ago | parent [-]

I think you are talking about a different problem and that has nothing to do with my comment.

▲foldr 32 minutes ago | parent [-]

Simplified, the point is that a lot of badly typed code that this bug lets through might be mostly harmless (or even fully semantically correct, in some instances). So you can't conclude that 'normal' code wouldn't trigger this bug just because no-one's noticed it until now. The bad code could could be happily executing and performing as expected.

▲LoganDark 4 hours ago | parent | prev | next [-]

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.

▲afdbcreid an hour ago | parent [-]

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.

▲jvanderbot 4 hours ago | parent | prev [-]

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).

▲bryanlarsen 4 hours ago | parent | next [-]

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

▲dwattttt 2 hours ago | parent | next [-]

How many of them only conditionally implement Drop, based on a generic param lifetime?

▲Xirdus 2 hours ago | parent [-]

Why would you ever conditionally custom impl Drop? I don't think I've ever seen that pattern, and I can't think of a use case.

▲jvanderbot 2 hours ago | parent | prev [-]

OK. That's good to know. I'm not sure why sharing our professional experience with this type of code is controversial, but here we are.

▲neysofu 3 hours ago | parent | prev | next [-]

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.

▲gspr 3 hours ago | parent | prev | next [-]

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.

▲ an hour ago | parent | prev | next [-]
[deleted]
▲rvz 2 hours ago | parent | prev [-]

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?

▲jvanderbot 2 hours ago | parent | next [-]

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.

▲bryanlarsen 2 hours ago | parent | next [-]

You said/implied 2 things:

- you've never written a custom Drop

- "Not really". Implying that your experience generalizes

I've written a bunch of rust programs without custom Drop. I believe your first statement. There are large classes of programs that don't need it. There are also many that do. I think your statement says a lot more about what kind of programs you work on than about custom Drop not being common. People are downvoting the implication that custom Drop is not a common pattern.

▲cmrdporcupine 2 hours ago | parent | prev [-]

Custom drops are all over the place. As others have said.

But not custom drops that are doing variadic type stuff like this, usually.

▲cmrdporcupine 2 hours ago | parent | prev [-]

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.