QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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:004412
用户头像

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

关注

评论

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

原创 | 使用JPA实现DDD持久化-O/R阻抗失配(1/2)

编程道与术

Java hibernate DDD JDBC jpa

云原生技术采用增加,全球60%后端开发人员都在使用容器

BoCloud博云

Kubernetes 容器 云原生 CaaS 博云

架构师训练营第十一周总结

Hanson

Docker商业版受限,胖容器是个选择

BoCloud博云

Docker 容器 博云

ARTS挑战打卡的100天,我学到了这些

老胡爱分享

ARTS 打卡计划

账户经常被盗号怎么办?防盗“黑科技”了解一下

华为云开发者联盟

华为云 云安全 主机安全 双因子认证 弱密码

开源流数据公司 StreamNative 推出 Pulsar 云服务,推进企业“流优先”进程

Apache Pulsar

Apache Pulsar 消息系统 消息中间件

计算机网络基础(二十一)---传输层-TCP连接的四次挥手

书旅

TCP 四次挥手 TCP/IP 协议族

满足消费者仪式感要求,木莲庄酒店做得很到位

InfoQ_967a83c6d0d7

性能相关,进程调度

Linuxer

用户注册密码保存与校验(golang版)

2流程序员

架构师训练营 第11周

大丁💸💵💴💶🚀🐟

如何在面试中表现你所没有的能力

escray

学习 面试

架构师训练营第十一周作业

Hanson

让这家有12万名员工、1.7万种产品的钢铁厂平滑上云的黑科技是什么?

华为云开发者联盟

大数据 云服务 华为云 非对称加密 KYON

一个用户秘密加密验证功能

elfkingw

薪水真的不是工作的全部

escray

学习 面试

week11 作业

Geek_196d0f

oeasy教您玩转linux010105详细手册man

o

在木莲庄酒店和孩子一起体验“团队作战”的乐趣!

InfoQ_967a83c6d0d7

升级的华为云“GaussDB”还能战否?

华为云开发者联盟

MySQL 数据库 开源 Elastic Stack GaussDB

上手Elasticsearch

北漂码农有话说

《精益创业》续

孙苏勇

随笔杂谈 精益创业

week11 小结

Geek_196d0f

分手快乐 祝你快乐 你可以找到更好的

escray

学习 面试

代理,一文入魂

苹果看辽宁体育

Java 后端 代理

年薪80万技术专家,面试通过后,被发现简历造假!合并8年前多段工作,惨遭警告和淘汰!

程序员生活志

程序员 面试 职场

易实战Spring Boot 2 资源汇总 从入门到精通 内含实战github代码 毫无保留分享

John(易筋)

redis Spring Boot 2 RestTemplate thymeleaf HikariCP

大数据技术思想入门(五):分布式计算特点

cristal

Java 大数据 hadoop 分布式

Flink状态管理-8

小知识点

大数据 flink scal

“DNAT+云链接+CDN”加速方案,助力出海企业落地生长

华为云开发者联盟

CDN 网络 华为云 企业出海 网络加速

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