Использование sizeof
оператор может вызвать непреднамеренные результаты
Этот дефект возникает, когда Polyspace® Bug Finder™ обнаруживает возможно непреднамеренные результаты от использования sizeof
оператор. Для образца:
Вы используете sizeof
оператор для имени параметра массива, ожидающий размера массива. Однако имя параметра массива само по себе является указателем. The sizeof
оператор возвращает размер этого указателя.
Вы используете sizeof
оператор элемента массива, ожидающий размера массива. Однако оператор возвращает размер элемента массива.
Аргумент размера некоторых функций, таких как strncmp
или wcsncpy
неправильный, поскольку вы использовали sizeof
оператор ранее с возможно неправильными ожиданиями. Для образца:
В вызове функции strncmp(string1, string2, num)
, num
получено из-за неправильного использования sizeof
оператор на указателе.
В вызове функции wcsncpy(destination, source, num)
, num
- это не количество широких символов, а размер в байтах, полученных при помощи sizeof
оператор. Например, вы используете wcsncpy(destination, source, sizeof(destination) - 1)
вместо wcsncpy(destination, source, (sizeof(desintation)/sizeof(wchar_t)) - 1)
.
Неправильное использование sizeof
оператор может вызвать следующие проблемы:
Если вы ожидаете sizeof
оператор, чтобы вернуть размер массива и использовать возврат значение для ограничения цикла, количество запусков цикла меньше, чем вы ожидаете.
Если вы используете возврат значение sizeof
оператор для выделения буфера, buffer size меньше, чем требуется. Недостаточный буфер может привести к результирующим слабостям, таким как переполнение буфера.
Если вы используете возврат значение sizeof
оператор неправильно при вызове функции, функция не ведет себя так, как вы ожидаете.
Возможные исправления:
Не используйте sizeof
оператор для имени параметра массива или элемента массива для определения размера массива.
Лучшая практика состоит в том, чтобы передать размер массива как параметр отдельной функции и использовать этот параметр в теле функции.
Используйте sizeof
оператор, чтобы тщательно определить число аргументов функций, таких как strncmp
или wcsncpy
. Например, для широких строковых функций, таких как wcsncpy
, используйте количество широких символов в качестве аргумента вместо количества байтов.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: SIZEOF_MISUSE |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 467 |