Standard function call with incorrect arguments

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

Описание

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

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

Тип функцииСитуацияРискЗафиксировать
Функции манипуляции строками, такие как strlen и strcpyАргументы указателя не указывают на NULL-terminated string.Поведение функции не определено.Передайте NULL-terminated string to string mandipulation functions.
Функции обработки файлов в stdio.h такие как fputc и freadThe FILE* аргумент указателя может иметь значение 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 Desktop.

См. примеры исправлений ниже.

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

Примеры

расширить все

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

enum {
    SIZE10 = 10,
    SIZE20 = 20
};

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

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

Перед выполнением анализа кода укажите 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: STD_FUNC_ARG_MISMATCH
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 628, 685, 686, 687, 690, 910
Введенный в R2015b