写点什么

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

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

关注

评论

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

大模型训练中的Prompt Learning

百度开发者中心

人工智能 大模型

NineData成功举办《国产数据库共话未来趋势》技术沙龙:大咖云集,共话未来

NineData

postgresql 阿里云 国产数据库 polarDB NineData

GraphPad Prism 10 for mac(统计分析绘图软件) v10.0.0.3注册激活版

mac

苹果mac Windows软件 GraphPad Prism 统计和绘图软件

大模型训练:提高AI能力的重要策略

百度开发者中心

人工智能 大模型

测试开发 | 数据分析与智能训练:体育领域的技术革新

测吧(北京)科技有限公司

测试

Lazada商品详情API在电商中的价值及实时数据获取实践

Noah

如何选择适合自己需求的云服务器?

Finovy Cloud

云计算 云服务 云服务器 云服务器ECS

一文读懂什么是智能工厂?

天津汇柏科技有限公司

智能工厂

非标产品如何提升竞争力?

菜根老谭

产品经理 产品感

大模型训练:多模态预训练的未来

百度开发者中心

人工智能 大模型

详解ZooKeeper在微服务注册中心的应用

华为云开发者联盟

开源 开发 华为云 华为云开发者联盟

智能引领决策:人工智能在决策支持系统中的崭新角色

测吧(北京)科技有限公司

测试

火热的低代码,蕴藏怎样的机会和挑战?

互联网工科生

软件开发 低代码开发 JNPF

DAPP算力云矿机系统开发丨源码技术搭建

l8l259l3365

揭开事件循环的神秘面纱

百度Geek说

web前端 事件循环 企业号12月PK榜

2023开源产业生态大会|华为深耕基础软件开源 使能千行百业创新

新消费日报

测试开发 | 创造性领域中的计算机生成艺术

测吧(北京)科技有限公司

测试

中手游全面启动鸿蒙原生游戏开发,为游戏产业发展注入新活力

新消费日报

测试开发 | 量子计算与人工智能的奇妙交融:开启全新计算时代

测吧(北京)科技有限公司

测试

测试管理圆桌讨论会 | 解锁测试管理的核心问题,提升您的管理实力!

测吧(北京)科技有限公司

测试

大语言模型训练数据常见的4种处理方法

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 大语言模型

Java基础知识:快速入门指南

技术冰糖葫芦

API

OmniReader Pro for Mac(图书阅读软件) 2.6.4永久激活版

mac

苹果mac Windows软件 OmniReader Pro 阅读软件

Apollo开放平台9.0让自动驾驶开发者轻松上手

石臻臻的杂货铺

人工智能 AI

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