Understanding Swift’s value type thread safety - 代码分析(二)
示范代码
`
func testScenarioA2() throws {
var store: Int = 100
DispatchQueue.concurrentPerform(iterations: 1_000_000) { _ in
store.negate()
_ = store
}
}
`
开启线程race诊断后,出现以下错误
Swift access race in closure #1 (Swift.Int) -> () in UnderstandStruct.testScenarioA2() throws -> ()
查看汇编
`
0x100002a30 <+0>: pushq %rbp
0x100002a31 <+1>: movq %rsp, %rbp
0x100002a34 <+4>: subq $0x20, %rsp
0x100002a38 <+8>: movq 0x8(%rbp), %rdi
0x100002a3c <+12>: movq %rsi, -0x10(%rbp)
0x100002a40 <+16>: callq 0x100003bac ; symbol stub for: __tsan_func_entry
0x100002a45 <+21>: xorl %esi, %esi
0x100002a47 <+23>: leaq -0x8(%rbp), %rax
0x100002a4b <+27>: movq %rax, %rdi
0x100002a4e <+30>: movl $0x8, %edx
0x100002a53 <+35>: callq 0x100003c06 ; symbol stub for: memset
0x100002a58 <+40>: xorl %ecx, %ecx
0x100002a5a <+42>: movl %ecx, %esi
0x100002a5c <+44>: movq -0x10(%rbp), %rdx
0x100002a60 <+48>: movq %rdx, -0x8(%rbp)
-> 0x100002a64 <+52>: movq %rdx, %rdi
0x100002a67 <+55>: movl $0x1, %edx
0x100002a6c <+60>: movq %rax, -0x18(%rbp)
0x100002a70 <+64>: callq 0x100003ba6 ; symbol stub for: __tsan_external_write
0x100002a75 <+69>: movq -0x10(%rbp), %rax
0x100002a79 <+73>: movq %rax, %rdi
0x100002a7c <+76>: callq 0x100003bbe ; symbol stub for: __tsan_read8
0x100002a81 <+81>: xorl %ecx, %ecx
0x100002a83 <+83>: movl %ecx, %eax
0x100002a85 <+85>: movq -0x10(%rbp), %rdx
0x100002a89 <+89>: subq (%rdx), %rax
0x100002a8c <+92>: seto %r8b
0x100002a90 <+96>: testb $0x1, %r8b
0x100002a94 <+100>: movq %rax, -0x20(%rbp)
0x100002a98 <+104>: jne 0x100002ac1 ; <+145> [inlined] Swift runtime failure: arithmetic overflow at main.swift:13
0x100002a9a <+106>: movq -0x10(%rbp), %rdi
0x100002a9e <+110>: callq 0x100003bc4 ; symbol stub for: __tsan_write8
0x100002aa3 <+115>: movq -0x10(%rbp), %rax
0x100002aa7 <+119>: movq -0x20(%rbp), %rcx
0x100002aab <+123>: movq %rcx, (%rax)
0x100002aae <+126>: movq %rax, %rdi
0x100002ab1 <+129>: callq 0x100003bbe ; symbol stub for: __tsan_read8
0x100002ab6 <+134>: callq 0x100003bb2 ; symbol stub for: __tsan_func_exit
0x100002abb <+139>: addq $0x20, %rsp
0x100002abf <+143>: popq %rbp
0x100002ac0 <+144>: retq
0x100002ac1 <+145>: ud2
0x100002ac3 <+147>: nopw %cs:(%rax,%rax)
0x100002acd <+157>: nopl (%rax)
`
0x100002aab <+123>: movq %rcx, (%rax)
rax是store的地址,直接将计算结果赋给指向的地址。
结论
- 对于堆中的变量 store,系统会自动生成 begin_access 和 end_access插桩的检测竞争代码,该代码不影响实际逻辑的执行
- 对于store的值的改变,不同线程中都是一条mov指令,所以这里存在的线程竞争不会导致crash
参考
`
bb0(%0 : $Int, %1 : $Int):
debug_value %0 : $Int // id: %2
debug_value_addr %1 : $Int, var, name "store", argno 2 // id: %3
%4 = begin_access [modify] [unknown] %1 : $Int // users: %7, %6
// function_ref SignedNumeric.negate()
%5 = function_ref @$ss13SignedNumericPsE6negateyyF : $@convention(method) <τ_0_0 where τ_0_0 : SignedNumeric> (@inout τ_0_0) -> () // user: %6
%6 = apply %5(%4) : $@convention(method) <τ_0_0 where τ_0_0 : SignedNumeric> (@inout τ_0_0) -> ()
end_access %4 : $Int // id: %7
%8 = begin_access [read] [unknown] %1 : $Int // users: %10, %9
%9 = load [trivial] %8 : $Int
end_access %8 : $*Int // id: %10
%11 = tuple () // user: %12
return %11 : $() // id: %12
}
`
Understanding Swift’s value type thread safety - 代码分析(二)的更多相关文章
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- SQL注入原理及代码分析(二)
前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...
- android4.0 的图库Gallery2代码分析(二)
最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...
- 信息管理代码分析<二>读取二进制文件数据
first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...
- FLINK流计算拓扑任务代码分析<二>
首先 是 StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); 我们在编写 fl ...
- XSS原理及代码分析
前言 XSS又叫跨站脚本攻击,是一种对网站应用程序的安全漏洞攻击技术.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响.XSS分为三种:反射型,存储型,和DOM型.下面我会构造有缺陷的代 ...
- Effective Java 70 Document thread safety
Principle The presence of the synchronized modifier in a method declaration is an implementation det ...
- 折返(Reentrancy)VS线程安全(Thread safety)
在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...
- clang的线程安全分析模块 thread safety analysis
介绍 Clang的线程安全分析模块是C++语言的一个扩展,能对代码中潜在的竞争条件进行警告.这种分析是完全静态的(即编译时进行),没有运行时的消耗.当前这个功能还在开发中,但它已经具备了足够的成熟度, ...
随机推荐
- EZHTTP(一键安装Nginx Apache PHP MySQL Memcached Pureftpd)安装【测试ing】
EZHTTP(一键安装Nginx Apache PHP MySQL Memcached Pureftpd)安装 [复制链接] 本帖最后由 梁国平 于 2014-2-11 22:47 编辑 简介 ...
- python mmsql连接支持
前言 因为我使用的是mmsql数据库,因为遇到一点坑,所以发布出来. 正文 准备工作: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 下载对应 ...
- 如何在ubuntu上安装QQ音乐
最简单易懂的安装QQ音乐教程,亲测可用!教程如下: 点击下方网址,进入QQ音乐下载页网址: https://y.qq.com/download/download.html 页面 点击Linux下方的下 ...
- 中国大陆地区维护的Linux操作系统
Linux开源生态丰富,中国大陆地区基于CentOS停服,依托阿里云.腾讯云.华为云三大私营企业,相继发布了自己的开源Linux定制版,很高兴的是他们只是改个名字并没有选择闭门造车,只是官网还是很不耻 ...
- Go原生插件使用问题全解析
简介: 本人在设计和落地基于Go原生插件机制的扩展开发产品时踩到了很多坑,由于这方面相关资料很少,因而借此机会做一个非常粗浅的总结,希望能对大家有所帮助.本文只说问题和解决方案,不读代码. 作者 | ...
- 工商银行分布式服务 C10K 场景解决方案
简介: Dubbo 是一款轻量级的开源 Java 服务框架,是众多企业在建设分布式服务架构时的首选.中国工商银行自 2014 年开始探索分布式架构转型工作,基于开源 Dubbo 自主研发了分布式服务平 ...
- 【视频特辑】提效神器!如何用Quick BI高效配置员工的用数权限
简介:随着企业数字化进程逐步加速,企业所产生和积累的数据资源日益增多.每当员工的用数权限发生变动,管理员都需要进行复杂繁琐的重复性配置流程,不仅耗时耗力还容易出错. 如何能便捷地对员工用数权限进行高 ...
- WPF 对接 Vortice 绘制 WIC 图片
本文告诉大家如何通过 Vortice 在 Direct2D 里面绘制图片,图片的来源是 WIC 加载出的图片 在上一篇博客 WPF 对接 Vortice 调用 WIC 加载图片 告诉了大家如何对接 V ...
- WPF 基于 Azure 的认知服务 情绪分析 语言检测 关键短语提取
本文主要是来安利大家基于 Azure 的认知服务,主要是文本认知服务,可以做到分析输入文本的情绪,以及判断当前输入文本所属语言等功能 本文分为两个部分 ,一个就是在 Azure 上的配置,另一个就是 ...
- 数据可视化之matplotlib模块
一.简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分析的最重要的工作之一,可以帮助我们完成很多操作,例如:找出异常值.必要的一些数据转换等.完成数据 ...