写点什么

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

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

关注

评论

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

分享5个Vue开发小技巧

程序员海军

Vue 7月月更

产品思维助力研发管理工具建设

研发管理Jojo

产品思维 研发管理工具 用户旅程 协同共创

算法题每日一练---第2天:棋盘放麦子

知心宝贝

算法 前端 后端 7月月更

LeetCode-101. 对称二叉树(java)

bug菌

Leet Code 7月月更

【LeetCode】数组能形成多少数对Java题解

Albert

LeetCode 7月月更

iOS 内存管理(基本概念及引用计数)

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

java零基础入门-java8新特性(完结篇)

喵手

Java 7月月更

面对复杂问题时,系统思考助你理解问题本质

阿里技术

系统性思考 复杂事件处理 业务逻辑

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

西柚子

DeFi 2.0的LaaS协议Elephant,重振DeFi赛道发展的关键

鳄鱼视界

Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266

小肉球

qt 7月月更

直播短视频源码——直播短视频源码的开发步骤顺序五步走

开源直播系统源码

软件开发 直播系统源码 开源源码 短视频直播源码

mysql进阶(八)排序问题方案探究

No Silver Bullet

MySQL 排序 中文编码 7月月更

OneFlow v0.8.0正式发布

OneFlow

版本更新

strcpy()

謓泽

7月月更

如何设计自动化测试case?

老张

自动化测试

STM32+BH1750光敏传感器获取光照强度

DS小龙哥

7月月更

Qt | 通过创建一个简单项目了解Qt Creator

YOLO.

qt Qt Creator 7月月更

Android root相关调研

沃德

android 程序员 7月月更

h5实现一个刮刮卡的动画效果

南极一块修炼千年的大冰块

7月月更

CSS动画篇之404动画

南城FE

CSS 前端 7月月更

C#入门系列(二十四) -- 密封类和静态类

陈言必行

7月月更

C# 基于MessageBox类的消息对话框讲解

IC00

C# 7月月更

拷贝构造函数剖析【C++】

攻城狮杰森

c++ 7月月更 拷贝构造函数

vivo官网APP全机型UI适配方案

vivo互联网技术

App UI

在 IDEA 里下个五子棋不过分吧?

沉默王二

Java Netty IDEA idea插件 idea plugin

查找——B+树

乔乔

7月月更

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

股市老人

Qt|使用Http通讯下载页面实时显示

中国好公民st

qt 7月月更

Unity实战问题-WebGL问题集锦-下篇

芝麻粒儿

android Unity 7月月更

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