Rust or any other compiler can't catch those type of bugs because they are not bugs at compiler level 🤷
post
// Don't bail on the first error, but remember the worst one.
let mut worst = 0;
for file in files {
if let Err(e) = chmod_one(file) {
worst = worst.max(e.exit_code());
}
}
process::exit(worst);
This is not rustic, I feel.
files.iter()
.map(chmod_one)
.filter_map(Result::err)
is more like it.
From there, you can next() for first error, last() for last error, or fold() for max error, or collect() if you need to save all errors.
And no, static compilation doesn’t help here, because
get_user_by_namegoes through NSS, which dlopenslibnss_*modules at runtime regardless of whether your binary is statically linked.
This is not true in musl systems. I just quickly checked in a Chimera rootfs (which has a system dynamic musl libc btw).
I believe the described dlopening is one of the well known reasons why GNU libc is not suitable for static linking, unlike musl!
In Arch, this indeed loads /usr/lib/libnss_systemd.so.2.
Everyone can test this with strace id 2>&1 | egrep 'open.*\.so'.
Time for Haskell?
How many more bugs would Haskell catch?
"Entire classes of bugs"?
Don’t Trust a Path Across Two Syscalls
Wasn't this a common knowledge among application developers? File system is volatile, and can change any time, do not assume persistence of it. I heard about the principle from ghcup developer a few years ago.
all 22 comments