今天跑单元测试,发现一个内存非法访问。开始以为是某些逻辑有错误,一直在看是不是哪里越界操作了。后来还是T同志比较快发现了,原来是一个类型转换出现的问题:在形如a[func())]的数组访问中,func()得到的竟然是个负数。而func的最后返回值,是形如 return (int)uiVar1 % iVar2 这样一个表达式。其中uiVar1是unsigned int型,iVar2是int型。之所以把iVar1转成有符号int,是因为uiVar1 % iVar2会产生PC-LINT告警,提示为混合符号类型的除法。显式转换是为了消除告警。
我开始怎么也想不到这个竟然会产生负数。因为在数学上,余数都是正的。后来经过我们的实验,并查阅了MSDN,原来%运算的符号,是和编译器有关的!真是危险啊。MS-C里面,求余的结果的符号,是和被除数一致的。把uiVar1转成int时,有可能成为了负数,于是整个返回值就是个负数了。
经过修改,代码变成return (int)(uiVar1 % (unsigned)iVar2),错误消除。