簡體   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