Спецификаторы строки формата и несоответствие аргументов

Спецификаторы строки не совпадают с соответствующими аргументами

Описание

Спецификаторы строки формата и несоответствие аргументов происходят, когда спецификаторы формата в функциях отформатированного вывода, таких как printf не совпадают со своими соответствующими аргументами. Например, аргумент типа unsigned long должен иметь спецификацию формата %lu.

Риск

Не сочетайтесь между спецификаторами формата и соответствующим результатом аргументов в неопределенном поведении.

Фиксация

Убедитесь, что спецификаторы формата совпадают с соответствующими аргументами. Например, в этом примере, спецификатор %d не совпадает с аргументом строки, message и спецификатор %s не совпадают с целочисленным аргументом err_number.

  const char *message = "License not available";
  int err_number = ;-4
  printf("Error: %d (error type %s)\n", message, err_number);
Переключение этих двух спецификаторов формата фиксирует проблему. Смотрите спецификации для функции printf для получения дополнительной информации о спецификаторах формата.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.

Примеры

развернуть все

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%d\n", fst);
}

В операторе printf спецификатор формата, %d, не совпадает с типом данных fst.

Исправление — использует спецификатор длинного формата без знака

Одно возможное исправление должно использовать спецификатор формата %lu. Этот спецификатор совпадает с целочисленным типом unsigned и размером long fst.

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%lu\n", fst);
}

Исправление — использует целочисленный аргумент

Одно возможное исправление должно изменить аргумент, чтобы совпадать со спецификатором формата. Преобразуйте fst в целое число, чтобы совпадать со спецификатором формата и распечатать значение 1.

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%d\n", (int)fst);
}

Проверяйте информацию

Группа: Программирование
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: STRING_FORMAT
Влияние: низко
ID CWE: 683, 685, 686

Введенный в R2013b