Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC警告与c类型转换_C_Linux_Gcc - Fatal编程技术网

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的每一个应用程序一样。我认为标准委员会和供应商应该将其放在淘汰的轨道上。