虽然通过一些c ++代码作为PCI DSS认证审核的一部分,但我发现了以下内容:
我在我们使用的某个库中有一个方法,其中一个参数是char*,让我们说这是
void foo(char* arg);
Run Code Online (Sandbox Code Playgroud)
代码中调用此方法的点如下所示:
char mystring[256];
strcpy(mystring, "some value");
....
foo(mystring);
Run Code Online (Sandbox Code Playgroud)
作为评论的一部分,我们正在摆脱任何strcpy调用(尽管在这个例子中它有点微不足道,因为"某些值"明显适合mystring)
所以我们得到:
char mystring[256];
strncpy(mystring, "some value", sizeof(mystring));
mystring[sizeof(mystring)-1] = '\0';
....
foo(mystring);
Run Code Online (Sandbox Code Playgroud)
这是因为我想
foo("some value")
Run Code Online (Sandbox Code Playgroud)
会通过一个 const char *
令我惊讶的是,编译器(gcc 4)对此非常满意.当我添加-Wall或-Wcast-qual时,它甚至不会发出任何警告
我的问题是:当我不知道foo实际上在做什么(如果有的话)时,我可以安全地调用foo("某些值")吗?
Nei*_*irk 10
不,如果你不能保证foo不会修改参数,那就不安全了.编译器可以隐式地转换字符串文字以便char *与C代码向后兼容(遗憾的是).您必须将文字复制到可修改的char缓冲区并传递它.
在这种情况下,
foo("some value")当我不知道foo它的参数究竟在做什么(如果有的话)时,我可以安全地打电话吗?
不可以.字符串文字是常量,尝试修改它会产生未定义的行为.
由于历史原因,char*有些编译器会允许转换为非const的非常规转换- 尽管从C++ 11开始转换不再有效.你不应该依赖它,希望你可以调高编译器的警告级别来防止它.
令我惊讶的是,编译器(gcc 4)对此非常满意.
这是令人惊讶的.我的GCC 4.6.3默认发出警告; 我需要指定-Wno-write-strings让它沉默.
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |