| ▲ | bawolff 3 hours ago |
| I'm not sure i think those situations are comparable. If a rust func is taking an Option<t>, its essentially advertising that it can handle None values. That feels quite a bit different from giving a c function a null pointer and having it freak out. |
|
| ▲ | eptcyka 3 hours ago | parent | next [-] |
| Ye, sure, but Rust won’t compile a `foo(std::ptr::null())`, if the function is defined as `fn foo(b: &Baz)`. C doesn’t get that luxury. That is the point of the article. |
| |
| ▲ | f33d5173 an hour ago | parent [-] | | $ gcc -Wall -Werror -x c - << EOF
void f(int x[static 1]){}int main(){f(0);}
EOF
<stdin>:1:37: error: null passed to a
callee that requires a non-null argument
[-Werror,-Wnonnull]
1 | void f(int x[static 1]){}int main(){f(0);}
| ^ ~
<stdin>:1:12: note: callee declares array
parameter as static here
1 | void f(int x[static 1]){}int main(){f(0);}
| ^~~~~~~~~~~
1 error generated.
It can be done, though it usually isn't. |
|
|
| ▲ | tialaramex 2 hours ago | parent | prev [-] |
| But it isn't different, that's Tony Hoare's Billion Dollar Mistake. |
| |
| ▲ | __s 2 hours ago | parent | next [-] | | It's absolutely different: “I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.” His mistake was making _all_ reference taking functions also accept null. In Rust functions opt into None | Some This comes up with C# which must have default(T) so references default to null. In Rust there is no general default(T) that must always resolve | | |
| ▲ | tialaramex an hour ago | parent [-] | | My contrast was to "That feels quite a bit different". The type system in C only has Tony's nullable references, you can't say that you don't mean that because it wasn't your choice to make, it's like if some C programmers say obviously they don't mean zero when they take an integer - too bad, C doesn't have the non-zero integers (Rust does, NonZeroI32 for example is the signed 32-bit integers except zero) |
| |
| ▲ | selfmodruntime 38 minutes ago | parent | prev [-] | | It is different. Handling `None` in a way that crashes your program is well defined in a Rust function. If you're using `unwrap` or `expect`, the program will crash with a stack trace and an error, instead of running into undefined behavior. |
|