我读过sqlite的源代码,并对此感到好奇。
static int strlen30(const char *z){
const char *z2 = z;
while( *z2 ){ z2++; }
return 0x3fffffff & (int)(z2 - z);
}为什么使用strlen30()而不是strlen() (在String.h中)?
发布于 2011-07-27 17:44:59
与此更改相关的commit message声明:
793aaebd8024896c是check-in c872d55493的一部分,千万不要使用strlen()。使用我们自己的内部sqlite3Strlen30(),它保证永远不会溢出整数。附加的显式强制转换,以避免出现麻烦警告消息。(CVS6007)(用户: drh分支:主干)
发布于 2011-07-27 17:51:03
CVS提交消息说:
从不使用strlen()。使用我们自己的内部sqlite3Strlen30(),它保证永远不会溢出整数。附加的显式强制转换,以避免出现麻烦警告消息。(CVS 6007)
我找不到任何关于这个提交的进一步引用,也没有解释他们是如何在那个地方获得溢出的。我相信这是某个静态代码分析工具报告的错误。
https://stackoverflow.com/questions/6842130
复制相似问题