PLT 板


LINE

看板 PLT  RSS
> 本文改写自 holydc 的原作。在此非常感谢原作者。 > 原文来自:https://webptt.com/cn.aspx?n=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 --- 会想改写这篇文章,是因为刚好跟朋友聊到 Unsafe Rust 及类型转换的话题。 这篇文章所涉及的操作多数都是 holydc 在原文中提及的操作,有兴趣的人可以对照一下 原文,不过我有删掉移动指针的部分(因为我的环境 .offset() 就会喷 Segmentation f ault),将其改成 LLVM IR 取 return address 的方法。 改写这篇文章也顺便让我熟悉 Unsafe Rust 的操作。假如有哪里写得不好,或者说有问 题,也欢迎跟我提出 QQ --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.173.112.222 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PLT/M.1636474355.A.B69.html
1F:推 stopcrying: (读之前)是新文章!(读完後)我看了什麽 o_O11/27 23:18
2F:推 zhibb: 这个好棒!不管你嗑了什麽,麻烦多来一点XD12/05 08:51
3F:推 ronin728: OCaml 哭了02/21 04:36
※ 编辑: pan93412 (218.173.90.142 台湾), 03/13/2022 08:57:11 ※ 编辑: pan93412 (218.173.90.142 台湾), 03/13/2022 09:06:09







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP