sscanf向string中写数据引发的天下奇案

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为只读内存,向其中非法写入数据将引发无法预知的奇怪问题

神奇的问题,排查到最后,总是归结于一个很低级(低级到都不会注意到它)的点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值