exponenta event banner

Вызов стандартной функции с неверными аргументами

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

Описание

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

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

Тип функцииСитуацияРискЗафиксировать
Функции управления строками, такие как strlen и strcpyАргументы указателя не указывают на NULL- завершенная строка.Поведение функции не определено.Пройти а NULL- завершенная строка для функций манипуляции строками.
Функции обработки файлов в stdio.h такие как fputc и fread 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: Аргумент строки поиска: "".

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

Зафиксировать

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

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

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

Примеры

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

#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
Воздействие: среднее
CWE ID: 628, 685, 686, 687, 690, 910
Представлен в R2015b