Swift 5将强制执行内存独占访问

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

Swift 5将带来改进的Swift程序内存安全性,在程序的其他部分修改变量时,不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和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)}

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

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

查看英文原文:
https://www.infoq.com/news/2019/02/swift-5-exclusive-memory-access

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 支持上传视频文件啦!

大家好,我是若川。今天周六,分享一篇热点新闻。文章较短,预计5分钟可看完。近日 Github 宣布支持了视频上传功能,意味着,大家在提 issue 时可以携带视频了,这极大地提高了开发者和维护者的效率,…

ui设计 网络错误_UI设计人员常犯的10个错误

ui设计 网络错误重点 (Top highlight)1.不考虑范围 (1. Disregarding scope)It’s not uncommon for designers to introduce features that will overcomplicate the development process while bringing no additional value to the application. Focusing on the business o…

灰色的生命

也许幸福从来没有在我身边也许是已经在我身边但我抓不住,摸不着 你的出现让我惊奇为我灰色的生命添上了从没见过的色彩我不相信这一切都是我的 不相信总是害怕相信了之后却要面对残酷的现实 但为何你让我相信所有抓住了希望却又转过身没有离去但让一切停止望着你不想说…

小程序 node.js mysql_基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)...

高仿网易严选的微信小程序商城(微信小程序客户端)界面高仿网易严选商城(主要是2016年wap版)测试数据采集自网易严选商城功能和数据库参考ecshop服务端api基于Node.jsThinkJSMySQL计划添加基于Vue.js的后台管理系统、PC版、Wap版项目截图功能列表首页分类…

前端菜鸟笔记 Day-5 CSS 高级

文章大纲来源:【Day 5】CSS 高级 CSS 选择器CSS 拓展CSS 单位CSS 参考手册CSS 选择器 内容引用:CSS 选择器 元素选择器 html { ... } 复制代码选择器分组 h2, p { ... } 复制代码类选择器 .important { ... } p.warning { ... } .important.warning { .…

推荐几个干货超多助你成长的前端大佬

不得不说,如今比前些年学习资料多很多了。现在的前端公众号也挺多的,这里推荐几个前端大佬运营的公众号,都是聚焦前端垂直领域的优质公众号,关注这些公众号至少可以:1、了解现在前端技术发展情况和未来发展趋势&#x…

背景图片_背景

背景图片A designer’s journey is one that’s littered with many portfolios. Many of which have been reduced to a mere 404 error page, an abandoned link or another archive in the folders. Recently, while updating my portfolio, all the forgotten versions tha…

解决《Mobile绘制背景图片》中的问题

与PC平台的开发相比,Mobile的开发麻烦了许多,至少这是我的感觉 。 谢谢--“ Fly Pig(^^)” 的文章《Mobile开发(绘制背景图片) 》 http://www.cnblogs.com/Bright-Liang/archive/2009/06/11/1501309.html 不过对于我这种低手来说&…

mysql 5.6.31 winx64_详解介绍MySQL5.6.31winx64.zip安装配置的图文教程

这篇文章主要介绍了MySQL5.6.31 winx64.zip 安装配置教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下#1. 下载##2.解压到本地 修改必要配置my*.ini#3.mysql installadmin模式启动cmdcd mysql目录/bin执行安装: mysqld -install启动…

如何使用Gitbook创建html技术文档

故事背景:很多时候对外发布的产品需要一份html格式的文档 首先要了解的是 word直接转成html是不现实的,需要通过md文件来转换。 我们本节课讨论的Gitbook即是在MD基础上进行操作的。 所以任务一:安装typora软件,用于编辑md文件&am…

徒手撸了个markdown笔记平台

大家好,我是若川。今天分享一篇markdown笔记平台的项目文章。点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列一、前言作为开发者,我觉的用markdown写文档是一件很酷的事情。在之前&#…

This week I’ve been forging background illustrations for my website, epdillon.com (launching soon). I’ve been using Adobe Illustrator to do all the major casting, dabbling in Figma only to temper the colours. Fresh from the design furnace, my hands are a…

【转】Vector与ArrayList区别

在写java的时候,基本上都喜欢用arraylist,甚至我都不知道有个vector的存在。查了一下发现又是线程安全问题。。。咋个线程安全天天围着我转呢。。。多得阿里巴巴,让我开始认识java的所谓线程安全问题。 the following is from:htt…

pyqt控件显示重叠_Python编程:一个不错的基于PyQt的Led控件显示库,建议收藏学习...

1、控件说明在Github上,偶然发现了一个基于PyQt5的第三方Led指示灯控件库,使用起来非常方便,控件外观也比较漂亮,更难能可贵的是作者源代码写得比较简洁,仅仅才约200行左右,可以作为一个在PyQt中写自定义控…

编写高质量可维护的代码:优雅命名

大家好,我是若川。今天分享一篇关于如何命名更优雅的文章。点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列本文首发于政采云前端团队博客:编写高质量可维护的代码:优雅命名ht…

继春晚不宕机后,百度云这次拿下携程大单

今年春晚,百度和央视联手发放高达9亿现金红包的消息,想必让不少人替百度捏了把汗。根据统计,春晚期间,全球观众参与百度App红包互动次数累计达到208亿次,日活从1.6亿冲上3亿关口,这么大的瞬时流量冲击是百度…

mysql int 11 java_mysql中int(11)列的大小(以字节为单位)是多少?

正如其他人所说,列可以存储的最小/最大值以及以字节为单位的存储量仅由类型而不是长度定义 .很多这些答案都说 (11) 部分仅影响显示宽度,这不完全正确,但主要是 .int(2) 与 no zerofill specified 的定义将:仍然接受 100 的值输出…

powerpoint技巧_几乎每个PowerPoint都烂鸡蛋

powerpoint技巧Almost 20 years ago — 2001! — Seth Godin wrote an ebook called Really Bad Powerpoint (and how to avoid it). In that book he detailed all of the things that tend to go wrong in slide presentations.差不多20年前-2001年! —塞斯戈丁(S…

认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库

初识 MySQL通信介绍MySQL 也是典型的 C / S 模型,分为客户端及服务端,服务端一般部署在远端服务器中,也可以部署至本地,然后客户端跟服务端通信则可以使用依赖网络的 TCP 长连接或 Unix-like 的系统下可以使用 Socket文件的形式通…

白帽子技术分析会话劫持实战讲解

前言通常,大家所说的hack,都是针对一台主机,在获得管理员权限后,就很是得意;其实,真正的hacker是占领整个内部网络。针对内部网络的hack方法比较多,但比较有效的方法非ARP欺骗、DNS欺骗莫属了。…