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