ISO/IEC TS 17961 [usrfmt]

Включая испорченный или вход вне основной области в строке формата

Описание

Управляйте определением

Включая испорченный или вход вне основной области в формате string.[1]

Реализация Polyspace

Это средство проверки проверяет на несоответствие спецификаторов и аргументов Строки формата.

Примеры

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

Проблема

Спецификаторы строки формата и несоответствие аргументов происходят, когда спецификаторы формата в отформатированном выводе функционируют, такие как 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);
}

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

Разрешимость: неразрешимый
Введенный в R2019a

[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.