CERT C: Rule FIO47-C

Используйте строки допустимого формата

Описание

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

Используйте строки допустимого формата. [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);
}

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

Группа: правило 09. Ввод-вывод (FIO)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.