【发布时间】:2014-04-08 06:38:49
【问题描述】:
我试图在新系统上编译旧项目,但在新系统中出现“从指针转换为不同大小的整数”警告。
这里是源代码:
void mem_fill(char *myptr, char *mystr, uint32_t sz)
{
uint32_t len = strlen((const char*)mystr);
if (len > sz) len = sz;
memset(myptr, (int)NULL, sz); // <-- Warnning reported here
memcpy(myptr, mystr, len);
}
NULL 的定义如下:
#define NULL (void *)0
老系统不会报这个错误,是RHEL4,gcc version 3.4.4 20050721。 新系统为Cent OS 6.5,gcc版本4.4.7 20120313
我尝试将转换类型“int”替换为“long”,然后新系统不会再次报告此错误,看起来新系统有64位指针。 但是,如果我将“int”替换为 long/char/short,所有类型都可以在旧系统上构建。
这是我的问题,为什么新系统会报告此铸造警告而旧系统不会?源代码是一样的,那么在开发环境的某处隐藏了gcc的其他默认设置吗?
这个函数等价于strncpy是个好观点。实际上我的问题是 - 为什么我的旧系统没有报告这个铸造警告,而新系统却报告了,它是由不同版本的 GCC 引起的吗?
感谢大家的帮助。
【问题讨论】:
-
我想放大@MattMcNabb 所说的话,在
strlen(myptr) >= sz生成的字符串不会以空值结尾的情况下。这几乎可以肯定是一个错误。如果(可能)需要一个以空字符结尾的字符串,请将@987654324@ 更改为if(len >= sz) len = sz-1;。 -
@AdrianRatnapala “这几乎可以肯定是一个错误。” ——不太确定。编写的这个函数等同于
strncpy,但有所有错误。 -
另外,第一行是“
const-confused”。应该是size_t len = strlen(mystr);。您永远不需要像那样将 转换为const。 -
@JimBalter,关于与
strncpy的相似性,这是一个很好的观点,这确实让我不太确定它是一个错误。然而,考虑到像(int)NULL这样奇怪的小东西和不需要的 const-cast,我仍然对该函数的原始作者没有信心。 ktan 最好检查空终止错误。 -
“ktan 最好检查空终止错误”——就像 strncpy 的每个应用程序一样。我认为标准委员会和供应商应该把它放在过时的道路上。