ПроблемаВозможное неправильное употребление sizeof происходит, когда Polyspace® Bug Finder™ обнаруживает возможно непреднамеренные результаты использования sizeof
оператор. Например:
Вы используете sizeof
оператор на имени параметра массива, ожидая размер массивов. Однако имя параметра массива отдельно является указателем. 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;
}
}