Описание
Возможное неправильное употребление 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;
}
}