说把vps迁移到64位系统后,collectd不记数据了,rrdupdate直接crash……
调试发现是implicit declaration干的好事情……
rrdupdate.c用到了basename(),但是没有引用libgen.h,于是basename()是隐式声明的。
根据古老的c的规定,隐式声明的函数返回值被当作了int,而64位系统上int是32位的。
所以本来好好的char*的返回值就被当作了int,返回值的高32位被干掉了,指针直接就飞了……
其实是有编译警告的,但是who cares……
所以c代码都该直接当c++编译,好的c代码应该可以直接编译…… 不声明就用算是什么feature,简直是个bug……
另外其实上游已经修了这个bug: https://github.com/oetiker/rrdtool-1.x/commit/d0bd4217d9fb69db9f94363087936cf93fa9b4ea,不过修完之后没有发新release,于是下游也没人管,毕竟谁喜欢用git tag打包……