簡體   English   中英

幫助gcc不要警告不使用字符串文字格式字符串

[英]Help gcc to not warn about not using a string literal format string

我在C中創建一個函數來將索引值轉換為字符串,這是對索引所代表的“字段”的詳細描述。

所以,我有一個很好的數組,其中包含索引的所有詳細描述。

要將它轉儲到緩沖區,我使用這樣的代碼

#define BUFFER_SIZE 40
void format_verbose(uint32_t my_index,
                    char     my_buffer[BUFFER_SIZE])
  {
    snprintf(mY_buffer, BUFFER_SIZE, "%s", MY_ARRAY[my_index].description);
  }

問題出現在某些情況下我需要在格式化時將一些其他字符串插入到字符串中。 所以我想要的是這樣的(這種情況下的描述包含%s )。

void format_verbose_with_data(uint32_t my_index,
                              char     my_buffer[BUFFER_SIZE])
  {
    // ...
    snprintf(mY_buffer, BUFFER_SIZE, MY_ARRAY[my_index].description,
             some_string);
  }

我們的make文件設置為使用snprintf()警告(危險),警告被視為錯誤。 所以,它不會編譯。 我想關閉這一行的警告,盡管它有點危險,我會控制字符串,我可以測試以確保它適用於它所調用的每個值。

或者,我很樂意以其他方式做到這一點,但我真的不想使用這個解決方案

void format_verbose_with_data(uint32_t my_index,
                              char     my_buffer[BUFFER_SIZE])
  {
    // ...
    snprintf(mY_buffer, BUFFER_SIZE, "%s%s%s"
    MY_ARRAY[my_index].description1, some_string,
    MY_ARRAY[my_index].description2);
  }

因為它使我的描述數組難看,特別是對於我不需要添加額外值的那些。

海灣合作委員會沒有能力逐​​行關閉警告,所以我懷疑你運氣不好。 無論如何,如果你的編碼標准說你不應該做某事,你就不應該找到打敗它們的方法。

還有一點,當你說:

void format_verbose(uint32_t my_index,
                    char     my_buffer[BUFFER_SIZE])

你真的在浪費你的時間打字 - 它說得更清楚,更客觀:

void format_verbose(uint32_t my_index,
                    char     my_buffer[])

要么:

void format_verbose(uint32_t my_index,
                    char     * my_buffer)

經過一夜的思考,我計划通過自己查找%s標記手動分割輸入字符串,然后將字符串separetley發送到snprintf()並使用自己的%s。 對於這種情況,只允許一種類型的格式字符串,這不那么繁重,但是嘗試完全重新實現printf()樣式解析器會很糟糕。

void format_verbose_with_data(uint32_t my_index,
                              char     my_buffer[BUFFER_SIZE])
  {
    char    pre_description[BUFFER_SIZE];
    char    post_description[BUFFER_SIZE];
    int32_t offset = -1;

    offset = find_string(MY_ARRAY[my_index].description, "%s");
    ASSERT(offset >=0, "No split location!");
    // Use offset to copy the pre and post descriptions
    // Exercise left to the reader :-)
    snprintf(mY_buffer, BUFFER_SIZE, "%s%s%s"
             pre_description, some_string, post_description);
  }

如果你用snprintf()做的就是復制字符串 (看起來就是這種情況),即你所擁有的只是一個或多個"%s"作為格式字符串,你為什么不使用strcpy() ,也許是strlen()首先檢查源的長度?

請注意, strncpy()雖然看起來不是一個好主意, strncpy()不是。 它總是用零填充目標緩沖區,如果源超過緩沖區大小, 則不會終止字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM