阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

Linux系统安装和使用Kafka教程。

百度搜索:蓝易云

云计算 kafka Linux 运维 云服务器

HyperDock for Mac(mac窗口调整工具)v1.8.0.10中文激活版

mac

苹果mac Windows软件下载 HyperDock 窗口调整工具

开源软件下游分发合规性讨论 ——“心寄源”法律沙龙(2023第四期 | 总第九期)成功召开

开放原子开源基金会

开源

华为携手华中地区5大高校倡议共建湖北省高性能计算研究院建设

彭飞

Chrome 浏览器+Postman做接口测试 ?

霍格沃兹测试开发学社

教你如何搭建K8S集群。

百度搜索:蓝易云

云计算 Kubernetes 运维 k8s 集群

微博评论高性能高可用计算架构

艾瑾行

架构训练营

DTCC 2023,8月16日北京见!

KaiwuDB

KaiwuDB DTCC 2023

小灯塔系列-中小企业数字化转型系列研究——企业网盘测评报告

向量智库

如何基于 ACK Serverless 快速部署 AI 推理服务

阿里巴巴云原生

阿里云 Serverless 容器 云原生 Serverless Kubernetes

“一日之际在于晨”,欢迎莅临WAVE SUMMIT上午场:Arm 虚拟硬件早餐交流会

飞桨PaddlePaddle

人工智能 paddle 百度飞桨 硬件生态

大模型时代,如何重塑AI人才的培养?知名高校专家为您解答

飞桨PaddlePaddle

人工智能 paddle 百度飞桨

制造执行系统(MES)在新能源领域的应用

万界星空科技

新能源 新能源行业

Docker容器安装Nginx教程。

百度搜索:蓝易云

nginx 云计算 Linux 容器 运维

小灯塔系列-中小企业数字化转型系列研究——项目管理测评报告

向量智库

TiDB Bot:用 Generative AI 构建企业专属的用户助手机器人

PingCAP

人工智能 数据库 AI TiDB

uiautomator2 自动化测试工具使用

霍格沃兹测试开发学社

it资产管理软件哪个好?既好用又安全?

行云管家

运维 IT运维 IT资产 IT资产管理

融云荣获「2023 中国数字生态通信领军企业」奖

融云 RongCloud

互联网 通信 数字 融云 AIGC

全链路Trace全量存储-重造索引

乘云 DataBuff

校源行丨开放原子开源基金会赴厦门大学访问交流

开放原子开源基金会

开源 校源行

如何快速完成PostgreSQL数据迁移?|NineData

NineData

postgresql 数据迁移 不停机发布 NineData 结构迁移

Syncovery for mac(文件备份和同步工具) 10.6.12激活版

mac

苹果mac Windows软件 Syncovery 文件同步和备份软件

万字干货分享 | 阿里云CIPU技术解析

阿里云弹性计算

10个微服务设计模式

越长大越悲伤

微服务 微服务设计

Linux 中的 su 和 sudo 命令有什么区别?

百度搜索:蓝易云

云计算 Linux 运维 sudo su

安徽阜阳是几线城市?有正规等级保护测评机构吗?

行云管家

等保 等级保护 等保测评机构 阜阳

小灯塔系列-中小企业数字化转型系列研究——任务管理测评报告

向量智库

数仓中典型的几种不下推语句整改案例

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

LED电子显示屏幕如何计算它的面积

Dylan

广告 交通 LED显示屏 全彩LED显示屏 体育

TiDB v7.1.0 跨业务系统多租户解决方案

PingCAP

MySQL 数据库 多租户 TiDB

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