Аргумент стандартной функции не соответствует требованиям для использования в функции
Этот дефект возникает, когда аргументы к определенным стандартным функциям не соответствуют требованиям к их использованию в функциях.
Например, аргументы в эти функции могут быть недопустимыми следующими способами.
| Тип функции | Ситуация | Риск | Зафиксировать |
|---|---|---|---|
Функции манипуляции строками, такие как strlen и strcpy | Аргументы указателя не указывают на NULL-terminated string. | Поведение функции не определено. | Передайте NULL-terminated string to string mandipulation functions. |
Функции обработки файлов в stdio.h такие как fputc и fread | The FILE* аргумент указателя может иметь значение NULL. | Поведение функции не определено. | Протестируйте FILE* указатель на NULL перед использованием в качестве аргумента функции. |
Функции обработки файлов в unistd.h такие как lseek и read | Аргумент дескриптора файла может быть -1. | Поведение функции не определено. Большинство реализаций | Проверьте возвращаемое значение Если возврат значение -1, проверьте значение |
| Аргумент дескриптора файла представляет дескриптор закрытого файла. | Поведение функции не определено. | Закройте дескриптор файла только после того, как вы полностью закончите его использование. Кроме того, повторно откройте дескриптор файла перед использованием его в качестве аргумента функции. | |
Функции генерации имен директорий, такие как mkdtemp и mkstemps | Последние шесть символов шаблона строки не XXXXXX. | Функция заменяет последние шесть символов строкой, которая делает имя файла уникальным. Если последние шесть символов не XXXXXXфункция не может сгенерировать достаточно уникальное имя директории. | Проверяйте, XXXXXX ли последние шесть символов строки перед использованием строки в качестве аргумента функции. |
Функции, связанные с переменными окружения, такими как getenv и setenv | Строковый аргумент "". | Поведение определяется реализацией. | Протестируйте строковый аргумент для "" прежде чем использовать его как getenv или setenv аргумент. |
Строковый аргумент заканчивается знаком равенства, =. Для образца, "C=" вместо "C". | Поведение определяется реализацией. | Не завершайте строковый аргумент =. | |
Функции обработки строк, такие как strtok и strstr |
| Некоторые реализации не обрабатывают эти краевые случаи. | Проверьте строку на "" перед использованием в качестве аргумента функции. |
Исправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.
См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: STD_FUNC_ARG_MISMATCH |
| Влияние: Средний |
| ИДЕНТИФИКАТОР CWE: 628, 685, 686, 687, 690, 910 |