Как мне обойти -Wormat-усечение? - PullRequest
0 голосов
/ 22 марта 2019

Предположим, у меня есть функция, принимающая int *p, которая, как я знаю, на самом деле указывает только на значения от 0 до 99. Однако компилятор этого не знает, поэтому, если я напишу:

char buffer[3];
snprintf(buffer, "%02d", *p);

Я получаю предупреждение (по крайней мере, в GCC 8.x) - это что-то вроде:

warning: ‘%02d’ directive output may be truncated writing between 2 and 11 bytes into a region of size 2 [-Wformat-truncation=]
   snprintf(buffer, "%02d", *p);

Как мне обойти это предупреждение?

1 Ответ

0 голосов
/ 22 марта 2019

Я могу придумать три способа обойти предупреждение:

  1. Локальное подавление с помощью прагмы GCC:

    #if __GNUC__ >= 8
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wformat-truncation"
    #endif
    snprintf(buffer, "%02d", *p);
    
    #if __GNUC__ >= 8
    #pragma GCC diagnostic pop
    #endif
    
  2. Бесполезный зажимнапечатанное значение, чтобы компилятор знал о диапазоне:

    char buffer[3]; 
    int clamped_value = min(max(*p,0),99)` and print that instead of `*p`.
    snprintf(buffer, "%02d", clamped_value);
    
  3. Искусственное увеличение размера буфера на дополнительные 9 байтов;
    char buffer[3+9]; 
    snprintf(buffer, "%02d", p);
    

Но мне это не очень нравится.Первый способ менее безопасен (и более многословен);Второй тратит впустую такты, а третий тратит пространство стека.

...