[英]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.