CERT C: Rec. DCL10-C

Поддержите контракт между средством записи и вызывающей стороной функций variadic

Описание

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

Поддержите контракт между средством записи и вызывающей стороной функций variadic. [1]

Примеры

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

Описание

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

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

Группа: Rec. 02. Объявления и инициализация (DCL)

Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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