游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Rust社区RFC导读构建安全的IO

  动机
  最近Rust官方合并了一个RFC,通过引入IO安全的概念和一套新的类型和特征,为AsRawFd和相关特质的用户提供关于其原始资源句柄的保证,从而弥补Rust中封装边界的漏洞。
  Rust标准库提供了IO安全性,保证程序持有私有的原始句柄(rawhandle),其他部分无法访问它。但是FromRawFd::fromrawfd是Unsafe的,所以在SafeRust中无法做到File::fromraw(7)这种事。在这个文件描述符上面进行IO操作,而这个文件描述符可能被程序的其他部分私自持有。
  但是,很多API通过接受原始句柄来进行IO操作:pubfndosomeioFD:AsRawFd(input:FD)io::Result(){somesyscall(input。asrawfd())}复制代码
  AsRawFd并没有限制asrawfd的返回值,所以dosomeio最终可以在任意的RawFd值上进行IO操作。甚至可以写dosomeio(7),因为RawFd本身实现了AsRawFd。这可能会导致程序访问错误的资源。甚至通过创建在其他部分私有的句柄别名来打破封装边界,导致一些诡异的远隔作用(Actionatadistance)。
  远隔作用(Actionatadistance)是一种程式设计中的反模式,是指程式某一部分的行为会广泛的受到程式其他部分指令的影响,而且要找到影响其他程式的指令很困难,甚至根本无法进行。
  在一些特殊的情况下,违反IO安全甚至会导致内存安全。IO安全概念引入
  标准库中有一些类型和特质:RawFd(Unix)RawHandleRawSocket(Windows),它们代表原始的操作系统资源句柄。这些类型本身并不提供任何行为,而只是代表可以传递给底层操作系统API的标识符。
  这些原始句柄可以被认为是原始指针,具有类似的危险性。虽然获得一个原始指针是安全的,但是如果一个原始指针不是一个有效的指针,或者如果它超过了它所指向的内存的生命周期,那么解引用原始指针可能会调用未定义的行为。
  同样,通过AsRawFd::asrawfd和类似的方式获得一个原始句柄是安全的,但是如果它不是一个有效的句柄或者在其资源关闭后使用,使用它来做IO可能会导致输出损坏、输入数据丢失或泄漏,或者违反封装边界。而在这两种情况下,影响可能是非局部的且影响到程序中其他不相关的部分。对原始指针危险的保护被称为内存安全,所以对原始句柄危险的保护被称为IO安全。
  Rust的标准库也有一些高级类型,如File和TcpStream,它们是这些原始句柄的封装器,提供了操作系统API的高级接口。
  这些高级类型也实现了Unixlike平台上的FromRawFd和Windows上的FromRawHandleFromRawSocket的特性,这些特性提供了包裹底层(lowlevel)值以产生上层(highlevel)值的函数。这些函数是不安全的,因为它们无法保证IO安全,类型系统并不限制传入的句柄。usestd::fs::File;usestd::os::unix::io::FromRawFd;Createafile。letfileFile::open(data。txt)?;从任意的整数值构造file然而这种类型的检查在运行时可能无法识别一个合法存活的资源或者它可能意外地在程序的其他地方被以别名方式封装处理(此处无法判断)这里添加unsafe块是让调用者来避免上述危险letforgedunsafe{File::fromrawfd(7)};Obtainacopyoffilesinnerrawhandle。letrawfdfile。asrawfd();Closefile。drop(file);Opensomeunrelatedfile。letanotherFile::open(another。txt)?;进一步使用rawfd,也就是file的内部原始句柄,将超出操作系统与之相关的生命周期这可能会导致它意外地与其他封装好的file实例发生别名,比如another因此,这里unsafe块是让调用者避免上述危险letdanglingunsafe{File::fromrawfd(rawfd)};复制代码
  调用者必须确保传入fromrawfd的值是明确地从操作系统返回的,而且fromrawfd的返回值不会超过操作系统与句柄相关的生命周期。
  IO安全的概念虽然是新的,但它反映出了一个普遍的做法。Rust生态系统将会逐步支持IO安全。IO安全Rust解决方案OwnedFd和BorrowedFdfd
  这两种类型用于替代RawFd,对句柄值赋予所有权语义,代表句柄值的拥有和借用。
  OwnedFd拥有一个fd,会在析构的时候关闭它。BorrowedFdfd中的生命周期参数表示对这个fd的访问被借用多长时间。
  对于Windows来说,也有类似的类型,但都是Handle和Socket形式。
  类型
  类似于
  OwnedFd
  Box
  BorrowedFda
  a
  RawFd
  const
  和其他类型相比,IO类型并不区分可变和不可变。操作系统资源可以在Rust的控制之外以各种方式共享,所以IO可以被认为是使用内部可变性。AsFd、Into和Fromh1
  这三个概念是AsRawFd::asrawfd、IntoRawFd::intorawfd和FromRawFd::fromrawfd的概念性替代,分别适用于大多数使用情况。它们以OwnedFd和BorrowedFd的方式工作,所以它们自动执行其IO安全不变性。pubfndosomeioFD:AsFd(input:FD)io::Result(){somesyscall(input。asfd())}复制代码
  使用这个类型,就会避免之前那个问题。由于AsFd只针对那些适当拥有或借用其文件描述符的类型实现,这个版本的dosomeio不必担心被传递假的或悬空的文件描述符。逐步采用
  IO安全和新的类型和特性不需要立即被采用,可以逐步采用。首先,std为所有相关的std类型添加新的类型和特质,并提供impls。这是一个向后兼容的变化。之后,crate可以开始使用新的类型,并为它们自己的类型实现新的特质。这些变化将是很小的,而且是半兼容的,不需要特别的协调。一旦标准库和足够多的流行crate实现了新的特质,crate就可以按照自己的节奏开始使用新的特质作为接受通用参数时的边界。这些将是与semver不兼容的变化,尽管大多数切换到这些新特质的API的用户不需要任何改变。原型实现
  该RFC内容原型已经实现,参见iolifetimes。
  RawAPI
  ThisexperimentalAPI
  Raw
  BorrowedandOwned
  AsRaw
  As
  IntoRaw
  Into
  FromRaw
  Fromtrait实现
  AsFd转换为原生fd,是带有生命周期参数的BorrowedFd〔cfg(any(unix,targetoswasi))〕pubtraitAsFd{Borrowsthefiledescriptor。Examplerust,norun!〔cfgattr(iolifetimesusestd,feature(iosafety))〕usestd::fs::File;usestd::io;useiolifetimes::{AsFd,BorrowedFd};letmutfFile::open(foo。txt)?;letborrowedfd:BorrowedFdf。asfd();Ok::(),io::Error(())fnasfd(self)BorrowedFd;}复制代码
  IntoFd从原生fd转为安全的fd,是OwnedFd〔cfg(any(unix,targetoswasi))〕pubtraitIntoFd{Consumesthisobject,returningtheunderlyingfiledescriptor。Examplerust,norun!〔cfgattr(iolifetimesusestd,feature(iosafety))〕usestd::fs::File;usestd::io;useiolifetimes::{IntoFd,OwnedFd};letfFile::open(foo。txt)?;letownedfd:OwnedFdf。intofd();Ok::(),io::Error(())fnintofd(self)OwnedFd;}复制代码
  FromFd从原生fd构造OwnedFd〔cfg(any(unix,targetoswasi))〕pubtraitFromFd{ConstructsanewinstanceofSelffromthegivenfiledescriptor。Examplerust,norun!〔cfgattr(iolifetimesusestd,feature(iosafety))〕usestd::fs::File;usestd::io;useiolifetimes::{FromFd,IntoFd,OwnedFd};letfFile::open(foo。txt)?;letownedfd:OwnedFdf。intofd();letfFile::fromfd(ownedfd);Ok::(),io::Error(())fnfromfd(owned:OwnedFd)Self;ConstructsanewinstanceofSelffromthegivenfiledescriptorconvertedfromintoowned。Examplerust,norun!〔cfgattr(iolifetimesusestd,feature(iosafety))〕usestd::fs::File;usestd::io;useiolifetimes::{FromFd,IntoFd};letfFile::open(foo。txt)?;letfFile::fromintofd(f);Ok::(),io::Error(())〔inline〕fnfromintofdOwned:IntoFd(intoowned:Owned)SelfwhereSelf:Sized,{Self::fromfd(intoowned。intofd())}}复制代码
  上述为针对Unix平台的trait,该库也包含Windows平台的相关trait:AsHandleAsSocket、IntoHandleIntoSocket、FromHandleFromSocket。相关类型
  BorrowedFdfd〔cfg(any(unix,targetoswasi))〕〔derive(Copy,Clone)〕〔repr(transparent)〕〔cfgattr(rustcattrs,rustclayoutscalarvalidrangestart(0))〕libstdosrawmod。rsassuresmethateverylibstdsupportedplatformhasa32bitcint。Belowis2,intwoscomplement,butthatonlyworksoutbecausecintis32bits。〔cfgattr(rustcattrs,rustclayoutscalarvalidrangeend(0xFFFFFFFE))〕pubstructBorrowedFdfd{fd:RawFd,phantom:PhantomDatafdOwnedFd,}〔cfg(any(unix,targetoswasi))〕〔repr(transparent)〕〔cfgattr(rustcattrs,rustclayoutscalarvalidrangestart(0))〕libstdosrawmod。rsassuresmethateverylibstdsupportedplatformhasa32bitcint。Belowis2,intwoscomplement,butthatonlyworksoutbecausecintis32bits。〔cfgattr(rustcattrs,rustclayoutscalarvalidrangeend(0xFFFFFFFE))〕pubstructOwnedFd{fd:RawFd,}〔cfg(any(unix,targetoswasi))〕implBorrowedFd{ReturnaBorrowedFdholdingthegivenrawfiledescriptor。SafetyTheresourcepointedtobyrawmustremainopenforthedurationofthereturnedBorrowedFd,anditmustnothavethevalue1。〔inline〕pubunsafefnborrowrawfd(fd:RawFd)Self{debugassertne!(fd,1i32asRawFd);Self{fd,phantom:PhantomData,}}}〔cfg(any(unix,targetoswasi))〕implAsRawFdforBorrowedFd{〔inline〕fnasrawfd(self)RawFd{self。fd}}〔cfg(any(unix,targetoswasi))〕implAsRawFdforOwnedFd{〔inline〕fnasrawfd(self)RawFd{self。fd}}〔cfg(any(unix,targetoswasi))〕implIntoRawFdforOwnedFd{〔inline〕fnintorawfd(self)RawFd{letfdself。fd;forget(self);fd}}〔cfg(any(unix,targetoswasi))〕implDropforOwnedFd{〔inline〕fndrop(mutself){〔cfg(featureclose)〕unsafe{letlibc::close(self。fdasstd::os::raw::cint);}Iftheclosefeatureisdisabled,weexpectuserstoavoidlettingOwnedFdinstancesdrop,sothatwedonthavetocallclose。〔cfg(not(featureclose))〕{unreachable!(dropcalledwithouttheclosefeatureiniolifetimes);}}}复制代码为std和其他生态库支持安全IO
  再构建一些跨平台抽象类型之后,为ffiasyncstdfserrmioospipesocket2tokiostd来支持安全IO抽象。使用案例From:https:github。comsunfishcodeiolifetimesblobmainexampleshello。rs〔cfg(all(rustcattrs,unix,featureclose))〕fnmain()io::Result(){write是capi,所以用unsafeletfdunsafe{Openafile,whichreturnsanOptionOwnedFd,whichwecanmaybeconvertintoanOwnedFile。拥有一个fdletfd:OwnedFdopen(devstdout。asptr()asconst,OWRONLYOCLOEXEC)。okorelse(io::Error::lastoserror)?;Borrowthefdtowritetoit。借用这个fdletresultwrite(fd。asfd(),hello,world。asptr()asconst,13);matchresult{1returnErr(io::Error::lastoserror()),13(),returnErr(io::Error::new(io::ErrorKind::Other,shortwrite)),}fd};ConvertintoaFile。Nounsafehere!这里不再需要Unsafe了letmutfileFile::fromfd(fd);writeln!(mutfile,greetings,yall)?;WecanborrowaBorrowedFdfromaFile。unsafe{借用fdletresultwrite(file。asfd(),sup?。asptr()asconst,5);matchresult{1returnErr(io::Error::lastoserror()),5(),returnErr(io::Error::new(io::ErrorKind::Other,shortwrite)),}}NowbacktoOwnedFd。letfdfile。intofd();不是必须的,会自动析构fdunsafe{Thisisntneeded,sincefdisownedandwouldcloseitselfondropautomatically,butitmakesanicedemoofpassinganOwnedFdintoanFFIcall。close(fd);}Ok(())}复制代码理由与替代方案关于unsafe是为了内存安全的说法
  Rust在历史上划定了一条界线,指出unsafe仅仅是用于内存安全相关。比较知名的例子是std::mem::forget,它增加是unsafe的,后来改为了safe。
  声明unsafe只用于内存安全的结论表明,unsafe不应该用于其他非内存安全类的API,比如标示某个API是应该避免使用的之类。
  内存安全优先级高于其他缺陷,因为它不仅仅是为了避免非预期行为,而是为了避免无法约束一段代码可能做的事情的情况。
  IO安全也是属于这类情况,理由有二:IO安全错误会导致内存安全错误,在mmap周围的安全包装器存在的情况下(在具有操作系统特定API的平台上,允许它们是安全的)。IO安全错误也意味着一段代码可以读取、写入或删除程序中其他部分使用的数据,而不需要命名它们或给它们一个引用。如果不知道链接到程序中的所有其他crate的实现细节,就不可能约束一个crate可以做的事情的集合。
  原始句柄很像进入独立地址空间的原始指针;它们可以悬空或以虚假的方式进行计算。IO安全与内存安全类似;两者都是为了防止诡异的远隔作用,而且在两者中,所有权是健壮抽象的主要基础,所以使用类似的安全概念是很自然的。相关github。comsmiller123github。combytecodeallRFC3128IOSafetynrc的RFC索引列表
  作者:RustMagazine
  链接:https:juejin。cnpost7044050750367858696

如何投放广告?谢囚禁的野马邀答!问:如何投放广告?这提问让人有点摸头不脑,你是想在今日头条上投放广告呢,还是还去市场投放广告?或是对广告不懂,想了解一下广告的策划与方式。如……仅为iPhone十分之一!小米开启低价换电池,价格只需49元随着快速充电技术的普及,除了旗舰手机之外,不少中低端智能手机也早就支持了快速充电技术,不少手机厂商甚至在千元智能手机上采用了65W、67W快速充电技术,大大加快了高功率快速充电……7月新能源TOP15比亚迪占五席大众ID。系列未上榜日前,乘联会发布了今年7月份全国乘用车产销数据,7月新能源汽车共计销售22。2万辆,同比上涨169,环比下降3。2。17月累计销量122。9万辆,同比上涨210。2。新能源汽车……易携带,超好用!aigo国民好物移动固态硬盘S7Pro简评随着时代的不断发展,各种电子产品不断更迭,储存领域也同样如此,从以往的U盘到机械硬盘,再从机械硬盘到现在的固态硬盘,短短几年时间就发生了多次迭代更新,容量和定价也出现不小的变动……2021如何选择显卡你需要考虑这5件事对于很多的计算机用户来说,现在显卡不管是在玩游戏还是设计办公方面都有很大的作用,因此选择合适的显卡是个很重要的事情,那么选择显卡你需要注意哪些事情呢?1。英伟达与AMD关……三星新品折叠手机支持防水?8月11日,三星举行新品发布会,推出了两款折叠屏智能手机GalaxyZFold35G和GalaxyZFlip35G。三星对折叠屏手机市场非常看好,其公布一组数据,折叠屏市……关于主板的问题及其解答小鹏电脑关于主板的问题及其解答:Q1:楼主,我的主板是H81芯片组的,这你没说过啊,这主板咋样?A1:像这种主板都是好几年前的了,比如H81H61B85B75等等,它们所支……想买一台音质效果很好的电脑用作hifi音源,有什么好的品牌型挑选Hifi音源,得看你的设备如何,如果你只有耳机,那么不推荐用电脑当音源。如果你有耳机解码器、耳机放大器,那么你可以买台声卡不错的电脑,用电脑usb接口输出到解码器、再将解码……华为的自动驾驶系统装在什么价格的车上卖得多呢?现在赛力斯华为智造SF5髙性能轿跑Su已经开始发售,价格24。68万,已有订单3000辆。而北汽蓝谷的ARCFOX极狐as正式发售,搭载华Hi有两款,售价分别是38。89万和4……屏下挖孔屏和折叠屏需要贴全面屏幕保护膜?最近雷总的小米发布了全新的小米MIX4全面屏手机,摄像头埋在了手机屏幕中,整体的第一视觉是看不到摄像头位置的。算是隐藏相机的好方法了!边框的处理也是极窄化!但是有一个问题是这种……携号转网的优劣势你知道吗?从专业角度说国家出台此项政策主要目的在于提升服务质量,对于消费者来说最大的好处就是号码的使用性价比高了,那么有人会问转到哪家运营商更好呢,实际上就是一个习惯问题,转一转网资费降……现在已经很少有非智能电视了,能否把智能电视刷成非智能电视?1,电脑显示器。2,打开电视后盖,如果是三块主板的,就直接把中间的电脑板扔了,信号直接给驱动板。如果只有一块,那就是三合一主板,直接扔了,自己买一块驱动板一块电源板插上就……
华为前自动驾驶部长苏箐被调离据互联网消息,之前在2021世界人工智能大会上锐评特斯拉:高事故率就是在杀人!的华为前自动驾驶部长苏箐,已经调离自动驾驶部门,目前进入战略预备队接受训战。据悉,此次人事调动由任……电气火灾的克星智能断路器不管是家庭中的热得快、电磁炉,还是工厂、商场中的大型用电设备,操作不当或检修不及时容易引发电气火灾。如何对工厂、学校宿舍等公共场所进行科学用电管理、预防火灾事故成了一件令人头痛……世界上首辆氢动力双层巴士将在苏格兰推出图片说明:世界首辆氢动力双层巴士将在苏格兰推出据称是世界上第一辆氢动力双层巴士将于今年晚些时候在苏格兰投入使用,这被视为氢燃料使用方面的重大进步。首先,香港人将运营……蚁人2里的角色与彩蛋盘点,轻微剧透1。故事背景影片开始时,蚁人斯科特只能在家中陪女儿玩迷宫探险游戏游戏。还因为一只脚伸出家门而惹来FBI上门。这件事的背景是蚁人在在内战中加入美国队长的反对派,遭到了政府的……自带游戏手柄的8寸电脑GPDWINMax公布,16G内存就问2019年等等了一整年的GPDWINMax,今年终于要同大家见面了,和之前的GPDWIN2游戏掌机相比,它拥有更强大的硬件性能,接近笔记本电脑的外观和键盘设计,同时也集成了游戏……全球搜与中国国际电子商务中心战略合作正式启动!2019年1月,全球搜与中国国际电子商务中心正式签订战略合作协议。精诚合作,将以全球顶尖的互联网技术、大数据人工智能以及专业团队,积极推动中国企业对外贸易发展,实现国际贸易的转……魅蓝3S图赏2016年6月13日,魅族发布了魅蓝系列的新品魅蓝3S,准确的来说是魅蓝3的升级版,在魅蓝3的基础上将电池的容量提升到了3020mAh,并且机身的外壳变为了金属。当然还有一些其……1830万台!明年折叠屏手机市场翻倍增长,专家小米立下汗马功自折叠屏问世以来,成为各大手机品牌秀肌肉的舞台,但由于折叠屏科研投入大,导致只有少数大厂有能力,有资金,有技术,去研制折叠屏手机,因而折叠屏手机的更新频率较低,没有良好的市场竞……不惦记别人老婆不被别人老婆惦记不惦记别人老婆、不被别人老婆惦记,是最大程度地尊重自己和他人的生命。最近刑事案件频发。不禁在想,这是怎么了?新年前后那么多的刑事案件,而且每一件都不小,都关乎人命,……微软决定在2022年6月15日结束IE浏览器使命,如何评价这作者:白苏链接:https:www。zhihu。comquestion460468482answer1905059646来源:知乎著作权归作者所有。商业转载请……优秀季报发布,渣打股票反应声下跌?问题出在哪里?亚洲贡献86财联社(深圳,记者成孟琦)讯,三地上市的渣打集团11月2日公布三季度业绩,2021年第三季度,渣打母公司股东应占溢利按年增加3。95倍至7。63亿美元,收入同比升7至38亿美元……北通游戏外设嘉年华23日开启,北通粉丝狂欢节10月23日,北通游戏外设嘉年华在广州琶醍啤酒文化创意艺术区多功能厅正式开幕,现场北通粉丝们都欢聚一堂,一起来庆祝这个属于北通粉丝的日子!在嘉年华现场,北通粉丝通心粉们一……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网