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