前情
newlib 是一个 C 库,经常用于嵌入式的开发中。有大佬把 newlib (4.3.0) 移植到了 switch 的自制开发环境中,这是前情。
问题
最近发现我写的一个程序使用大佬最新的 newlib (4.3.0) 依赖编译,会出现随机的蓝屏。通过查看,发现是视频播放器( libmpv )会调用 vsnprintf ,这个函数多线程调用运行不稳定。
同时通过编写示例代码,发现不仅仅是 vsnprintf ,vsprintf 、sprintf 、snprintf 在使用的时候都会出现这样的问题。
进一步分析
- 只有在格式化字符中包含部分格式符时才会有这个问题,比如 "%f",是因为为了计算的更精确,newlib 会在浮点数格式化时调用 _Balloc 动态申请一点内存。问题出在多线程调用 _Balloc 里。
- malloc 是没有问题的,我猜是因为有实现 malloc 锁
- 老版本(基于 4.2.0 的修改版)也是没有问题的,对比代码也没看出来啥。
我的疑问
因为这个在老版本没有问题,新版本出了问题,所以我推测可能是大佬最新版 (4.3.0) 修改版哪里没改好出的问题。
给大佬提了issue (devkitPro/newlib/issues/27),能看到大佬最近在写别的,没理我,我也没好意思继续追问(卑微~)。
想问问有 newlib 使用经验的兄弟们:
- sprintf 本身就不是线程安全的吗?
- 这个问题可能是什么原因导致的呢?