“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

Swift 5 将强制执行内存独占访问

  • 2019-02-13
  • 本文字数:1136 字

    阅读完需:约 4 分钟

Swift 5将强制执行内存独占访问

Swift 5 将带来改进的 Swift 程序内存安全性,在程序的其他部分修改变量时,不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和 Swift 编译器本身都有重要影响。


Swift 5 将带来改进的Swift程序内存安全性,在程序的其他部分修改变量时,不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和 Swift 编译器本身都有重要影响。


在多种情况下会发生独占内存访问问题。编译器可以静态地捕获大部分问题,剩下的只能在运行时处理。只能在运行时处理的问题包括具有转义闭包、类类型属性、静态属性和全局变量的排他性违规。


为了更好地说明这个问题,我们可以考虑一个相当普遍的情况:修改一个函数的 inout 变量,这个函数执行了一个闭包,这个闭包使用同一作用域内的两个不同的名称访问上述的变量:


func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) {  modifier(&value)  modifier(&value)}
func testCount() { var count = 1 modifyTwice(&count) { $0 += count } print(count)}
复制代码


在这个例子中,因为使用 count 同时作为 modifyTwice 和 modifier 的 inout 参数,所以出现了问题。我们不清楚 print 语句应该打印出什么内容。第一次 count 变量递增,它的值递增到 2。但是,当执行第二次加法时,要添加到 $0 的 count 值是多少?这可能取决于很多因素,因为内存操作不一定是瞬时的。更糟糕的是,编译器可能会引入优化,进一步使这种情况复杂化。


这个问题不仅与通过不同变量名同时修改内存的不可预测性有关,也与编译器的复杂性有关。


这可能会导致意外和混乱的结果。它还导致编译器和标准库的实现具有很大的保守性,它们通常必须确保程序的基本可靠性(没有崩溃或未定义的行为),即使是在不寻常的情况下。


所有这些意味着如果发现独占访问冲突,使用 Swift 5 编译器编译的应用程序将在运行时崩溃。这个行为以前在 Swift 4 编译器调试模式下可用,因此,仅在运行时模式下测试过的程序在使用 Swift 5 编译时有崩溃的风险。


Swift 4 编译器可用,因此仅在运行时模式下测试的程序在使用 Swift 5 编译时可能会崩溃。


修复访问独占违规的一般方法是复制数据。在我们的示例中,这将归结为:


func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) {  modifier(&value)  modifier(&value)}
func testCount() { var count = 1 let increment = count modifyTwice(&count) { $0 += increment } print(count)}
复制代码


实际上,访问独占违规检查可能会被禁用,但强烈建议不要这样做:


虽然禁用运行时检查可能可以解决性能问题,但这并不意味着独占违规是安全的。如果没有启用强制执行,程序员必须遵守独占规则。


查看英文原文:


https://www.infoq.com/news/2019/02/swift-5-exclusive-memory-access


2019-02-13 08:004271
用户头像

发布了 731 篇内容, 共 432.0 次阅读, 收获喜欢 1996 次。

关注

评论

发布
暂无评论
发现更多内容

一款双极锁存型霍尔位置传感器

攻城狮Wayne

诚邀报名|与你同行——开源教育晨雾中的早行者

开放原子开源基金会

开源

软件开发

Geek_8da502

一起学Elasticsearch系列-深度分页问题

Java随想录

Java 大数据 elastic

#issue 111538 MySQL 8.0 instant add/drop column 性能回退问题

ba0tiao

MySQL InnoDB

Wi-Fi 6 vs. Wi-Fi 6E: The differences between IPQ6018, IPQ6010 and IPQ5018

wallysSK

杭州悦数成立「悦数图技术陆家嘴数据智能研究院」,入驻上海陆家嘴金融城「双城辉映」平台

最新动态

支付宝 v3 自签名如何实现

盐焗代码虾

Java 支付宝 签名 加签

web3钱包进阶!从入门到精通,Bitget实现逆袭

EOSdreamer111

【Web安全】DVWA漏洞靶场搭建流程(win系统下)

Geek_Angel

网络安全 WEB安全 DVWA 实验靶场

Chappyz 生态迎重磅利好:多链应用程序启动、100% 收入共享计划开启

股市老人

诚邀报名|来开源项目维护者论坛,为项目可持续发展贡献您的声音

开放原子开源基金会

开源

倒计时3天|开源开发者的技术年末盛典即将开启

开放原子开源基金会

开源

C 语言运算符详解

小万哥

c c++ 程序员 后端 软件开发

如何写好Prompt,让GPT 的回答更加精准

Bob Lin

人工智能 openai ChatGPT GPT-4 langchain

centos 7.6安装sealos和单机集群

麦兜

开源时代:极狐GitLab如何保证软件供应链安全

极狐GitLab

TDengine 创始人陶建辉出席 CIAS 2023 年会,为新能源汽车数据处理带来新思路

TDengine

tdengine 时序数据库

5G和云渲染将如何快速推进XR和元宇宙?

3DCAT实时渲染

云渲染 元宇宙解决方案

脉脉宣布全员下调,华为莫名奇妙躺枪。。。

Jackpop

华为终于开奖了,结果有点可笑

Jackpop

唯品会商品列表数据接口(Vip.item_search)丨唯品会API接口

tbapi

唯品会商品列表数据接口 关键词搜索唯品会接口 唯品会API接口 唯品会商品数据接口 唯品会商品API接口

顶级加密混淆混淆工具测评:ipagurd

Chappyz 生态迎利好:多链应用程序启动、100% 收入共享计划开启

EOSdreamer111

诚邀报名|探寻AI融合的前端开发之道:解除焦虑,构建核心竞争力

开放原子开源基金会

开源

宏 | AI工程化部署

AIWeker

c AI AI工程化部署

[译]优秀的URL设计

南城FE

前端 后端 url

大数据时代:我对大数据的发展趋势与前景展望

屿小夏

大数据

web3钱包进阶!从入门到精通,Bitget实现逆袭

股市老人

vivo 容器平台资源运营实践

vivo互联网技术

容器平台 资源运营 利用率提升

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理 | 京东云技术团队

京东科技开发者

Swift 5将强制执行内存独占访问_语言 & 开发_Sergio De Simone_InfoQ精选文章