HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

ICCV 2023 | 当尺度感知调制遇上Transformer,会碰撞出怎样的火花?

阿里云大数据AI技术

人工智能

HBase入门指南

Java随想录

Java 大数据 habse

可以拯救陈年老视频的Topaz Video AI

展初云

Mac软件 视频修复工具

央国企数字化转型的破局者:低代码引领变革,高效应对未来挑战

优秀

低代码 数字化转型 央国企数字化转型

全场景流量验证系统 | 京东物流技术团队

京东科技开发者

系统设计 测试 企业号10月PK榜 流量验证

关系数据库:定义、模型、排名

Frank

关系型数据库

Mac平台的视频编辑和调色软件 DaVinci Resolve Studio 18

展初云

Mac软件 视频编辑 达芬奇18

基于火山引擎云搜索服务的排序学习实战

字节跳动云原生计算

大数据 搜索引擎 云原生

【稳定性】稳定性建设之弹性设计 | 京东物流技术团队

京东科技开发者

系统稳定性 限流算法 企业号10月PK榜 弹性设计

数字赋能,联通未来——数划云亮相“2023创源工业互联网创新大赛暨优秀项目路演”

数划云

如何搭建一个集成导航与在线工具的个性化浏览器私有书签(附详细搭建教程)

百度搜索:蓝易云

云计算 Linux 运维 书签 Mtab

深度学习算法:从模仿到创造

小魏写代码

开放原子开源大赛 | OpenAnolis赛题正式启动,诚邀报名!

开放原子开源基金会

MySQL分区表详解

Java随想录

Java MySQL

官宣|2023开放原子开发者大会来了!

开放原子开源基金会

Redis中的Big Key问题:排查与解决思路

Java随想录

Java redis

与客户携手共进|博睿数据客户最佳实践精选

博睿数据

可观测性

DAPP钱包单币丨多币丨LP质押挖矿系统开发

l8l259l3365

数划云受邀参与2023甄云用户大会,分享数据驱动经营新经济企业业财一体新路径

数划云

飞桨大模型套件:一站式体验,性能极致,生态兼容

飞桨PaddlePaddle

nlp 大模型 套件 大语言模型

Spring扩展-自定义标签

Spark入门指南:从基础概念到实践应用全解析

Java随想录

Java 大数据 spark

软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本

测试人

人工智能 程序员 软件测试 测试开发 ChatGPT

Scala语言入门:初学者的基础语法指南

Java随想录

Java scala 大数据

有限状态机在国际计费中的应用探索 | 京东物流技术团队

京东科技开发者

状态机 有限状态机 企业号10月PK榜 系统应用

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