sscanf的神奇功能
项目中遇到的神奇问题,在此记录一下解决过程。
问题现象
SIP可视对讲无视频显示。单独播放视频正常,走SIP可视对讲就不行。
问题排查
怀疑是SIP对讲流程影响了播放流程,于是具体排查:
-
日志、抓包、码流分析,查看是否有异常
码流数据已经收到,但是数据异常,无法播放
-
和正常抓包对比
发现url请求trackID字段异常
-
追踪url全流程
对trackID字段赋值时,莫名其妙变成了某个IP地址(SIP服务器地址)
-
怀疑是踩内存
重新编译替换库和头文件,依然无效
-
逐行加日志打印,详细分析trackID字段出错过程
通过逐行打印,定位到sscanf调用之后,字符串打印就变成了IP地址
-
发现了sscanf的神奇功能
通过sscanf向string.c_str中写入字符数据,可以引发string内部异常,之后所有读取的string.c_str值均为该写入的值
解决方案
至此,终于明确了问题所在:sscanf非法向string.c_str中写入数据,破坏了string内存结构,导致后续读取string.c_str出错。
于是,先使用临时字符数组接收数据,再填充到string中。
TODO
后面有时间再研究一下string的内存结构,彻底揭开谜底
总结
- sscanf可以通过格式化的方式提取字符串中的子串
- string.c_str为只读内存,向其中非法写入数据将引发无法预知的奇怪问题
神奇的问题,排查到最后,总是归结于一个很低级(低级到都不会注意到它)的点。