发布于 2014-01-17 12:45:39
17楼
其实从芳侠给的图上,偶看到最让人叫绝的是那高端大气上档次的“伪浮点数”。
余额的最小单位是分,所以把个十进制数除100,标个小数点就变成元了,完全无需转换成浮点数,真正高大上。
开个玩笑,从Y版让人恍然大悟的计算来看,我们分析下芳侠这张图有些什么内涵。
1、首先是错误怎么产生的,很明显如我刚才说的,把分除100变成元,其实也没什么问题,只是数据类型不能选择无符号32位而必须选有符号的32位(即DINT型)。我想应该是做画面的仁兄犯二了。
2、那么这个漏洞有多严重呢?是否如芳侠所虑,对交通卡的继续使用造成影响呢?我想主要是扣费判断时,数值是否正确。我猜想(没搞过只能猜)读卡器读取交通卡时应该读的是32个bit,然后以DWORD的方式存储,做扣费判断前转换为十进制数判断。关键就是这个转换,是否选了DINT,毕竟程序里要做大量判断的,我想只要做程序的兄弟没有和做画面的一样犯二,不至于会选错。真要犯这种错误,那可比画面选错严重多了。
3、我又想到为什么计算时不用浮点数呢?如果用浮点数会怎么样?单精度浮点数有7位有效数字,加减时有效数字超过7位就会被忽略。那需要多大的余额才会让你有机会免费蹭车?貌似余额1000万以上可以有机会让你扣除5元以下的时候被忽略。(当然充值5元以下也会被忽略,那就呵呵了)