繁体   English   中英

将const char *传递给foo(char *)

[英]Passing a const char* to foo(char*)

在通过一些c ++代码作为PCI DSS认证审查的一部分时,我遇到了以下问题:

我在我们使用的某些库中有一个方法,其参数之一是char *,可以说这是

void foo(char* arg);

代码中调用此方法的点如下所示:

char mystring[256];
strcpy(mystring, "some value");
....
foo(mystring);

作为审查的一部分,我们摆脱了所有strcpy调用(尽管在此示例中,这有点琐碎,因为“某些值”显然适合mystring)

这样我们得到:

char mystring[256];
strncpy(mystring, "some value", sizeof(mystring));
mystring[sizeof(mystring)-1] = '\0';
....
foo(mystring);

因为我以为

foo("some value")

将通过const char *

但是令我惊讶的是,编译器(gcc 4)对此非常满意。 当我添加-Wall或-Wcast-qual时,它甚至不发出任何警告

我的问题是:在这种情况下,我不知道foo实际上对其参数做了什么时(如果有的话),可以安全地调用foo(“ some value”)吗?

不,如果不能保证foo不会修改参数,那是不安全的。 编译器可以隐式地将字符串文字转换为char *以实现与C代码的向后兼容性(不幸的是)。 您将必须将文字复制到可修改的char缓冲区中,然后传递它。

在这种情况下,当我不知道foo对其参数的实际作用(如果有)时,可以安全地调用foo("some value")吗?

否。字符串文字是常量,尝试对其进行修改会产生不确定的行为。

由于历史原因,有些编译器将允许过时转换为非const char* ,尽管该转换自C ++ 11起不再有效。 您不应该依赖于此,希望您可以提高编译器上的警告级别以防止它发生。

但是令我惊讶的是,编译器(gcc 4)对此非常满意。

令人惊讶。 我的GCC 4.6.3默认发出警告; 我需要指定-Wno-write-strings使其静音。

顺便说一句,您使用的是strncpy错误。 size参数应为目标缓冲区的大小减一:

char mystring[256];
strncpy(mystring, "some value", 255);
mystring[255] = '\0';

目的是防止缓冲区溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM