GCC警告与c类型转换
我试图在一个新系统上编译一个旧项目,但我在新系统中得到了“从指针到不同大小的整数的转换”警告 以下是源代码:GCC警告与c类型转换,c,linux,gcc,C,Linux,Gcc,我试图在一个新系统上编译一个旧项目,但我在新系统中得到了“从指针到不同大小的整数的转换”警告 以下是源代码: 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); // <-- Warnnin
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);
}
旧系统不会报告此错误,它是RHEL4,gcc版本3.4.4 20050721。
新系统是Cent OS 6.5,gcc版本4.4.7 20120313
我尝试将强制类型“int”替换为“long”,这样新系统就不会再次报告此错误,看起来新系统有64位指针。
但是,如果我将“int”替换为long/char/short,那么所有类型都可以在旧系统上传递构建
我的问题是,为什么新系统会报告这个施法警告,而旧系统不会?源代码是相同的,那么在开发环境中是否有隐藏的gcc的其他默认设置
这个函数相当于strncpy,这是一个很好的观点。事实上,我的问题是——为什么我的旧系统不报告此铸造警告,而新系统报告此警告,这是由不同版本的GCC引起的?
谢谢大家的帮助。将
(int)NULL
更改为0
。参数应该是用来填充内存的字节值,第一次编写该代码的人不理解空指针和值为零的字节之间的区别。将(int)null
更改为0
。参数应该是用来填充内存的字节值,第一次编写该代码的人不理解空指针和值为零的字节之间的区别。直接使用0
而不是(int)null
memset(myptr, 0, sz);
旧系统中没有警告可能是因为NULL
被定义为:
#define NULL 0
NULL
的两个定义在标准C中都是合法的。直接使用0
而不是(int)NULL
memset(myptr, 0, sz);
旧系统中没有警告可能是因为NULL
被定义为:
#define NULL 0
NULL
的两个定义在标准C中都是合法的。请记住,当且仅当字符串短于缓冲区时,此代码才会生成以NULL结尾的字符串,如果我要移植这段代码,我肯定会检查这个函数的所有调用,并检查它是否尝试假定为空终止。这个函数相当于strncpy
,使用它通常(事实上通常)是一个bug。是的。不过我更喜欢这个版本,因为当你在别人的代码中看到strncpy
时,你总是想知道他们是否有其他意图。是的,但我们不得不想知道他们是否也有其他意图——这就是你警告的重点,毕竟。请记住,当且仅当字符串比缓冲区短时,此代码才会生成以null结尾的字符串,如果我移植此代码,我肯定会遍历此函数的所有调用,并检查它是否尝试假定为null结尾。此函数相当于strncpy
,使用它通常(事实上通常)是一个bug。不过,我更喜欢这个版本,因为当你在别人的代码中看到strncpy
时,你总是想知道他们是否有其他意图。是的,但我们不得不想知道他们是否也有其他意图——这毕竟是你警告的重点。我想在strlen的情况下,放大@mattmcnab所说的内容(myptr)>=sz
生成的字符串不会以null结尾。这几乎肯定是一个错误。如果(很可能)需要以null结尾的字符串,请将If(len>sz)len=sz;
更改为If(len>=sz)len=sz-1;
@adriantnapala“这几乎肯定是一个错误。”--不太确定。编写的此函数相当于strncpy
,有所有错误。此外,第一行是“const
-fuzzle”。它应该是size\t len=strlen(mystr)
。你永远不需要像这样强制转换到常量。@JimBalter,这是一个很好的观点,它与strncpy
相似,这确实让我不太确定它是一个bug。然而,考虑到(int)这样奇怪的小东西,我仍然对函数的原始编写者缺乏信心NULL
和不需要的const cast。ktan最好检查NULL终止错误。“ktan最好检查NULL终止错误”--就像strncpy的每一个应用一样。我认为标准委员会和供应商应该把它放在淘汰的轨道上。我想进一步说明@MattMcNabb所说的,在strlen(myptr)>=sz
的情况下,结果字符串不会以null结尾。这几乎肯定是一个bug。If(很可能)需要一个以null结尾的字符串,将if(len>sz)len=sz;
更改为if(len>=sz)len=sz-1;
@AdrianRatnapala“这几乎肯定是个bug。”--不太确定。编写的这个函数相当于strncpy
,有所有的错误。而且,第一行是“const
-混淆”。它应该是size\t len=strlen(mystr);
。你永远不需要像这样强制转换到const
。@JimBalter,这是一个很好的观点,它与strncpy
相似,这确实让我不太确定它是一个bug。然而,考虑到(int)NULL
和不必要的常量转换。ktan最好检查NULL终止错误。“ktan最好检查NULL终止错误”——就像strncpy的每一个应用程序一样。我认为标准委员会和供应商应该将其放在淘汰的轨道上。