Standard function call with incorrect arguments

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

Описание

Этот дефект происходит, когда аргументы к функциям определенного стандарта не удовлетворяют требования для своего использования в функциях.

Например, аргументы к этим функциям могут быть недопустимыми следующими способами.

Функциональный типСитуацияРискФиксация
Обработка строк функционирует, такие как strlen и strcpyАргументы указателя не указывают на NULL- отключенная строка.Поведение функции не определено.Передайте NULL- отключенная строка к функциям обработки строк.
Обработка файла функционирует в stdio.h такой как fputc и freadFILE* аргумент указателя может иметь значение NULL.Поведение функции не определено.Протестируйте FILE* указатель для NULL перед использованием его как аргумент функции.
Обработка файла функционирует в unistd.h такой как lseek и read Аргумент дескриптора файла может быть-1.

Поведение функции не определено.

Большинство реализаций open функция возвращает значение дескриптора файла-1. Кроме того, они устанавливают errno указать, что ошибка произошла при открытии файла.

Протестируйте возвращаемое значение open функция для-1 перед использованием его в качестве аргумента для read или lseek.

Если возвращаемое значение-1, проверяйте значение errno видеть, какая ошибка произошла.

Аргумент дескриптора файла представляет закрытый дескриптор файла.Поведение функции не определено.Закройте дескриптор файла только после того, как вы полностью закончите использовать его. В качестве альтернативы вновь откройте дескриптор файла перед использованием его как аргумент функции.
Генерация имени каталога функционирует, такие как mkdtemp и mkstempsПоследними шестью символами шаблона строки не является XXXXXX.Функция заменяет последние шесть символов на строку, которая делает имя файла уникальным. Если последними шестью символами не является XXXXXX, функция не может сгенерировать достаточно уникальное имя каталога.Протестируйте, если последними шестью символами строки является XXXXXX перед использованием строки как аргумент функции.
Функции, связанные с переменными окружения, такими как getenv и setenvАргументом строки является "".Поведение задано реализацией.Протестируйте аргумент строки на "" перед использованием его как getenv или setenv аргумент.
Аргумент строки завершает работу со знаком "равно", =. Например, "C=" вместо "C".Поведение задано реализацией.Не отключайте аргумент строки с =.
Представьте в виде строки функции обработки, такие как strtok и strstr

  • strtok: Аргументом разделителя является "".

  • strstr: Аргументом строки поиска является "".

Некоторые реализации не обрабатывают эти случаи ребра.Протестируйте строку для "" перед использованием его как аргумент функции.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже.

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

Примеры

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

#include <string.h>
#include <stdlib.h>

enum {
    SIZE10 = 10,
    SIZE20 = 20
};

int func() {
    char* s = NULL;
    return strnlen(s, SIZE20);
}

В этом примере, NULL указатель передается как strnlen аргумент вместо NULL- отключенная строка.

Перед рабочим анализом кода задайте компилятор GNU®. Смотрите Compiler (-compiler).

Коррекция — передает NULL- отключенная Строка

Передайте NULL- отключенная строка в качестве первого аргумента strnlen.

#include <string.h>
#include <stdlib.h>

enum {
    SIZE10 = 10,
    SIZE20 = 20
};

int func() {
    char* s = "";
    return strnlen(s, SIZE20);
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: STD_FUNC_ARG_MISMATCH
Удар: Средняя
ID CWE: 628, 685, 686, 687, 690, 910
Введенный в R2015b