在通过一些 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") 吗?