博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 5将强制执行内存独占访问
阅读量:6135 次
发布时间:2019-06-21

本文共 1408 字,大约阅读时间需要 4 分钟。

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

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

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

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

func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) {  modifier(\u0026amp;value)  modifier(\u0026amp;value)}func testCount() {  var count = 1  modifyTwice(\u0026amp;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) -\u0026gt; ()) {  modifier(\u0026amp;value)  modifier(\u0026amp;value)}func testCount() {  var count = 1  let increment = count  modifyTwice(\u0026amp;count) { $0 += increment }  print(count)}

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

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

查看英文原文:

转载地址:http://hheua.baihongyu.com/

你可能感兴趣的文章
回家路上想起来关于Js一个有趣的东西
查看>>
B端大数据应用的架构实践与思考
查看>>
2019 SRE 调查报告:事故处理是主要工作,SRE 压力山大
查看>>
React创建组件的三种方式及其区别
查看>>
大中型企业的天网:Apache Geode
查看>>
Windows Server已可安装Docker,Azure开始支持Mesosphere
查看>>
本地部署比SaaS更容易满足GDPR要求吗?
查看>>
业内预测:2017中国光通信设备规模将达近千亿元
查看>>
网页开发从业者仍更重视桌面程序及网页应用
查看>>
如何解决mysql数据库8小时无连接自动关闭
查看>>
ASP.NET Aries 入门开发教程5:自定义列表页工具栏区
查看>>
Rushcrm:如何利用CRM系统的权限设置
查看>>
《Cisco IPv6网络实现技术(修订版)》一2.7 复习题
查看>>
Facebook 开源 Android 调试工具 —— Stetho
查看>>
生活不止有苟且,还有N个免费DevOps开源工具
查看>>
视频直播Android推流SDK初体验
查看>>
第十三天:制定预算
查看>>
java技术团队必须要注意的那几个点
查看>>
Hibernate ORM 5.1.7 发布,数据持久层框架
查看>>
数百万网站因流行 PHP 脚本的安全漏洞而受影响
查看>>