RT-Smart开发笔记:int类型数值溢出造成的奇怪问题的分析与排查记录

前言
最近在调试 rt-smart 上的用户态 mq(消息队列)时,遇到一个奇怪的问题,这个例程打印了一下获取的时间,就可以正常的工作(超时退出),否则,就一直卡住(无法超时)
虽然没有认真的阅读用户态 mq 的具体实现代码,大概能了解到底层对接了 ipc 消息队列,如果一直卡住,可能的原因是超时时间参数没有正确传递下?
排查思路
当前未采用 qemu 调试,直接使用板子验证,所以就手动增加了一些 log,用户态应用与 内核态的应用,很快定位到是 内核代码 softwarekernelcomponentslibccompilerscommonctime.c 中的函数 rt_timespec_to_tick 返回值异常导致的
开启log 打印一下时间,就可以【正常】退出
不开启 log,发现卡住了,也就是 ipc 一直没有超时
继续排查
发现 tick 计算的有问题,异常的 tick,也就是 ipc timeout 非常大
找到根源:int 型乘法计算溢出
tick = second * rt_tick_per_second + nsecond * rt_tick_per_second / nanosecond_per_second;,这里 nsecond 定义为 int 类型,int 是 32位,所以当 nsecond 较大时,再乘上 rt_tick_per_second, 也就是 1000,由于32位有符号整数溢出,变为了【负值】。
而此时 second 比较小,造成 tick 为一个 负值,但是 timeout 是无符号的,所以把一个负值当成无符号数,就是一个比较大的数值
解决方法
第一种,把 nsecond 定义为 int64_t 类型,也就是 long long 类型,这样计算时,会按照 64位计算,不会溢出
第二种:把 tick = second * rt_tick_per_second + nsecond * rt_tick_per_second / nanosecond_per_second; 改为 tick = second * rt_tick_per_second + nsecond / (nanosecond_per_second / rt_tick_per_second);
小结
这问题,如果粗心一点,可能会直接【放过】,比如加了 log 打印发现没有问题,但是细节决定成败,有些 bug 可能出现的方式很奇特,这就是测试代码需要有一定的覆盖性,各个场景下都需要验证,比如 debug 版本、 release 版本都测试一下,看看现象是否一致。
经过了解 int 溢出,也发现了一些基础性的知识点,如 32位与64位 cpu 下, long long 类型都是 8字节,如果使用 long 类型定义 nsecond,在 32位平台上,是 4字节,依旧是异常有问题
修复问题后,再次验证,发现定时比较的准确了,偏差很小,比如 20秒,20000 个 tick,而不是 19001 个 tick
修复后,再次运行的效果,此时 tick = 19994,与 20秒比较匹配
msh /kernel>./mq_test
msh /kernel>31111111111111111111111111111
msg_queue is 3
main : enter
sys_mq_timedreceive : 5974 1514764824-963161303
tp : 1676378 - 1514764804
tm_spec : 1676378 - 1514764824
rt_timespec_to_tick : line - 730, second : 19, nsecond : 994459929
rt_timespec_to_tick : tick = 19994
mq_timedreceive : tick = 19994
mq_receive()

2021年Q1中兴终端江苏渠道交流会顺利举行
不同角度的机器学习算法比较
Apple切入智能汽车领域 浅谈现代自动驾驶策略
电动升降桌要怎么选,从哪些方面去考虑
小米6、小米note3和小米mix2,哪款才是你最期待的?
RT-Smart开发笔记:int类型数值溢出造成的奇怪问题的分析与排查记录
关于具有自动断电保护功能的交流电源连接装置的设计
昆船AGV首次实现出口,随着应用领域的不断拓展留下优美的足迹
张艺兴​代言的华为nova2怎么样
如何选择调速电机的型号规格?
用高μ管制作胆前级放大器,Tube preamp
CDMA与LTE数据互操作的空中接口的讨论与分析
陶瓷基复合材料在航空发动机及高温燃气轮机的应用
鼎阳产品在全国大学生电子设计竞赛各赛区广泛使用
小米有品上架小白智能猫眼M1,采用小米人脸识别算法
什么是千兆光模块和万兆光模块?它们有什么区别?
纯电感电路中电流与电压的相位关系
中兴通讯助力吉林移动构建5G时代商业成功
苹果研发精密传感器用于头戴式设备技术
5G只有网速快这一个优点吗