今天查一个和RTP协议有关的bug,代码不是我写的,如果是我写很有可能也会犯这个错误。
为了对应这个问题,我先是把网上关于RTP协议的博客又大致看了一遍,然后有把出错的函数的功能简单过了一遍。
又把调试信息打印了一遍。最后基本确定是隐式类型转换的问题,不需要做什么大的改动。
因为是前人写的代码,理解和修改都得小心翼翼,怕改了引发新的bug。
错误代码: if ((packet->last_seq_num + 1) != last_seq_num)
//( 其中packet->last_seq_num,last_seq_num 均是unsigned short类型)
//数字 1 默认是 int 类型,这样就会导致隐式类型转换,埋下了一个bug。
正确的代码: if ((unsigned short)(packet->last_seq_num + (unsigned short)1) != last_seq_num)
//注意, 需要两次强制转换:① 1默认是int 类型需要强制转换
// ②(packet->last_seq_num + (unsigned short)1) 相加的
//的和也需要转换,否则二者想加溢出后默认类型又是int了
解决了这个bug,让我对公司强制要求的代码规更加认同了,有些代码规范我们觉得很死板可能是见识的少,
缺乏对代码规范的重视。