> 本文改写自 holydc 的原作。在此非常感谢原作者。
> 原文来自:https://www.ptt.cc/bbs/TKU_EE_92C/M.1477360815.A.46B.html
“你是不是有什么事情瞒着我”
下班一回到家,就看到 Rust 对我怒目而视
“怎么会呢,我们之间是没有秘密的呀”
我一边换上居家服,一边敷衍回应
“那你说说看这是怎么回事”
Rust 打开我的 GitHub 帐号,指着我最近绿油油的一片
“我还想说你最近这么喜欢类型体操,原来是跟 TypeScript 有一腿啊”
我顿时语塞,因为我最近确实拿 TypeScript 的类型系统写了个踩地雷游戏
不过我随即反击
“我以前写 pattern matching 的时候你也怀疑我跟 Haskell,妳到底想要我怎么样”
Rust 似乎是有点被我吓到,愣了一下之后对我吼道
“我只是想要你这个不中用的废物争气点!”
你这个不中用的废物!
这句话仿佛对我的脑门挥下一记重击
是啊,我就是废物
cargo clippy 全是 warn,至今遇到 lifetime 问题只会 `.clone()`
更不用说还有做不完的 feature 和解不完的 bug
就连经过茶水间也听到女同事在说“欸欸那个肥宅 holydc 好恶心喔”“真~的~”
于是,我感觉到头脑里有什么东西断掉了
失去理智的我把 Rust 推倒在 CLion 上,并且把她的原始档拘束起来
“你…你想做什么!?快放开我!”
Rust 奋力抵抗,但是这样却更激起了我的兽性
“啊啊…妳果然还是最美的,我果然还是最爱妳了啊”
fn main() {
我看着 Rust 毫无防备的进入点…main 函数,情不自禁地又闻又舔
“对了,我有准备一个可以让妳很舒服的东西,这是妳姊姊 Unsafe Rust 最喜欢的玩具”
“那是…啊”
let a: *mut () = unsafe { std::mem::MaybeUninit::uninit().assume_i
nit() };
我冷不防地把指标放入 Safe Rust 的函数里面,受到刺激的 Rust 也不禁发出一声娇喘
unsafe { *(a as *mut i8) = i8::MAX; }
“啊…等一下…嗯…指标还没…”
Rust 一边挣扎一边说著,却被我毫不留情地打断
“哦,看来 1 byte 没问题嘛,那就继续放囉”※1
unsafe { *(a as *mut i16) = i16::MAX; }
“呜…不要…”
到刚才为止都还盛气凌人的 Rust,这时脸上泛著潮红,表情开始扭曲
但是我当然不可能就此罢手
unsafe { *(a as *mut i32) = i32::MAX; }
“已经…满了…”
Rust 哀求着说
“少装死了,`*mut ()` 都能塞进 i32 了。接下来才是重头戏呢~”※1
unsafe { *(a as *mut i128) = i128::MAX; }
“啊…啊…”
此时 Rust 已经只能呻吟,腰部因为强烈的刺激而反弓起来
“真是乖孩子,真亏妳能撑到现在呢”
我温柔地擦去 Rust 额头上的汗水
“接下来这个就是最后了”
struct Foo([i32; 1024]);
“不可以不可以不可以不可以不可以,这个真的没办法…”
unsafe { *(a as *mut Foo) = Foo([0; 1024]); }
“------------------------------!啊嘿”
只见 Rust 双眼翻白,舌头半吐,几乎失去了意识
“哈哈哈,没初始化的指标就变成各种形状感觉怎么样啊”
“好过分…为什么要做这种事”
Rust 哭丧著脸,身体止不住颤抖
“因为我想更加了解妳呀”
#![feature(link_llvm_intrinsics)]
“…咦?”
“猜猜看这是什么呢?”
extern {
#[link_name = "llvm.addressofreturnaddress"]
fn return_address() -> *mut u8;
}
“呜…”
“快说喔,不然我就要进去了喔!”
let b: *mut u8 = unsafe { return_address() };
“啊…嗯…是…return address…”
Rust 极为羞耻地说出
“好吧,那今天就‘到此’为止吧”
unsafe { *b = u8::MAX };
“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊”
我看着失神的 Rust
胸口随着紊乱的呼吸起伏,腹部还是不断痉挛
四处飞溅的体液、唾液、汗液沾湿了整片文字编辑器
整个 IDE 充满著淫靡的气息
“我什么都愿意做…拜托你原谅我”
回过神的 Rust 气若游丝,苦苦哀求
“好吧,那妳就让我听听最悦耳的哭喊声…”
drop_in_place()
“咦…骗人…不会吧…这样真的会坏掉的!”
“那就坏掉吧”
unsafe {
a.drop_in_place();
b.drop_in_place();
}
}
“不要------------------------------!”
“哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈”
“…dc”
嗯?什么声音?
“喂,holydc”
我睁开眼睛,寻找声音的来源,原来是公司主管
“明天发表会要 demo 的版本弄得怎样了?”
“我们能不能拿到新一轮的融资就看这次了,好好加油啊”
我揉一揉眼睛,看了看时间,凌晨两点四十三分,Redmine 上面还有六张票
“好,继续 debug 吧!”
※1 建置环境 rustc 1.58.0-nightly (db062de72 2021-11-01) on macOS (ARM64)
assert_eq!(std::mem::size_of::<()>(), 0);
assert_eq!(std::mem::size_of::<i8>(), 1);
assert_eq!(std::mem::size_of::<i16>(), 2);
assert_eq!(std::mem::size_of::<i32>(), 4);
assert_eq!(std::mem::size_of::<i128>(), 16);
Linux (Rust Playground) 环境似乎会直接 SIGSEGV。
但我的 macOS 是能正常执行到 `到达函数结尾`。
本次的完整程式码在此:https://play.rust-lang.org/?version=nightly&mode=debug&e
dition=2021&gist=f8a81cefaf9dff88471cdf9caa78c518