ПроблемаВозможное неправильное использование 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
, используйте количество широких символов в качестве аргумента вместо количества байтов.
Пример - sizeof
Неправильное использование для определения размера массива#define MAX_SIZE 1024
void func(int a[MAX_SIZE]) {
int i;
for (i = 0; i < sizeof(a)/sizeof(int); i++) {
a[i] = i + 1;
}
}
В этом примере sizeof(a)
возвращает размер указателя a
а не размер массива.
Коррекция - определите размер массива другим способомОдна возможная коррекция состоит в том, чтобы использовать другое средство для определения размера массива.
#define MAX_SIZE 1024
void func(int a[MAX_SIZE]) {
int i;
for (i = 0; i < MAX_SIZE; i++) {
a[i] = i + 1;
}
}