记录下上周工作中发现的bug
月卡一次购买,终身会员
这个月卡功能其实刚开发完没多久,qa测试也还没结束,自己当时测试时也没发现异常。直到上周在开发另一功能时,无意间发现,月卡只要购买一次,之后过期一段时间后便无法再次续费,而且过期后还能继续领取月卡每日奖励。。。这个Bug真的是恐怖,要是放出去到线上,估摸着就完蛋了。。。
月卡的倒计时其实记录的就是一个到期的时间戳,每次续费或者领取奖励的时候,我们会先去判断下当前剩余的月卡天数。问题就出在这个计算月卡剩余天数的函数里面,里面调用了项目里面的一个库函数进行计算一个时间戳到现在时间相差的游戏天数,而这个时间函数仅仅返回的是两者相差的时间差,并没有告诉上层函数待比较的两个时间戳的大小关系。也就是说,如果月卡过期了n天,函数返回的也是n。所以,bug就出现在这里,我们只判断如果返回天数为0,则视为过期,而只要购买过1次,这个函数永远不会返回0。
当然,修复的方式也很简单,只需要在调用这个库函数前,先判断下过期时间戳和当前时间戳的大小即可,如果过期时间戳小于当前时间戳也就认为是已经过期了。之所以想记录下这个bug,主要提醒下自己,对于第三方api的具体实现逻辑一定要进去好好看看,避免再次踩坑。等级越高,获得经验值越低?
在服务端,基本上都是unsigned int类型,如果需要浮点运算,一般的做法也是在配置文件里面配置成万分比,然后再除以10000。这个bug的产生,是计算过程值没有考虑会溢出的情况。比如(a + level * b) * c / 10000 / 10000。b和c都是一个配置里面的万分比数值,b*c的量级就已经达到了亿级别,再乘以玩家等级level。如果玩家等级超过43级,则在除以10000之前,过程值就溢出了。所以需要调整运算的顺序以解决问题。