我们之前说过, snprintf类型不匹配, 容易导致core dump, 今天我们说点别的。
协议文件中定义了long, 经序列化后, 变成了C++中的long long, 然后在使用snprintf时候就没有严格匹配, 导致了天大的坑。 在繁杂的代码中排查好久, 逐步缩小范围, 才找到原因。
为了简便起见, 直接上代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
long long x = 1234;
char szBuf[128] = {0};
snprintf(szBuf, sizeof(szBuf), "haha%d,%s", x, "5678");
printf("%s\n", szBuf);
return 0;
}
我们大概以为结果是:
haha1234,5678
实际结果是:
haha1234,(null)
我们还可能以为, long long形式的x转成int形式的x, 不还是1234吗? 和int x有什么差别呢?
这种以为就太武断了, 历史经验告诉我们, 不要依赖于未定义的行为。
还是老老实实用%lld吧, 或者把long long强转为int. 关于snprintf, 也可查查源码。
遇到这种问题, 要用“最小化”和“”“对照”法来定位。