Есть ли эксперты по шинам?Я пытаюсь использовать splint для статического анализа большого проекта, который у меня есть в C. Я вижу избыточное количество ошибок проверки границ, которые явно не являются ошибками границ.Я написал небольшую тестовую программу, чтобы попытаться изолировать проблему, и заметил несколько действительно странных предупреждений, когда запускал шину по коду.У меня есть 3 разных примера.Вот первое:
int arr[3];
int main(void)
{
int i;
int var;
arr[3] = 0; // (1) warning with +bounds, no warning with +likely-bounds
return 0;
}
Назначение arr[3]
генерирует предупреждение при использовании +bounds
, как и следовало ожидать, но ничего не делает, когда я использую +likely-bounds
.Что делает +likely-bounds
?Кажется, не работает.Второй пример:
int arr[3];
int main(void)
{
int i;
int var;
for (i = 0; i < 3; i++)
var = arr[i]; // (2) warning, even though I'm within the bounds.
return 0;
}
В этом примере splint жалуется, что я читаю за пределами массива («Чтение памяти ссылается на память за пределами выделенного хранилища.») Для var = arr[i]
, хотяЯ, очевидно, нет.Это должно быть предупреждением, потому что значения в массиве не инициализируются, но это не предупреждение, которое я получаю.Инициализация последнего значения в массиве очистит ошибку (но инициализация первого или второго не даст).Я делаю что-то неправильно?В третьем примере:
int arr[3];
int main(void)
{
int i;
int var;
arr[3] = 0; // warning
for (i = 0; i < 4; i++)
var = arr[i]; // (3) no warning because arr[3] = 0 statement.
return 0;
}
Предупреждение генерируется для arr[3] = 0
, но не для var = arr[i]
, хотя очевидно, что цикл выходит за границы массива.Похоже, что запись в конец массива расширяет представление о том, насколько массивен массив.Как это возможно?
Короче говоря, мои вопросы:
- Что делает флаг вероятных границ?
- Есть ли способ, которым я могу заставить шину дать мне законные ошибки, которые относятся к выходу за пределы?
- Есть ли способ заставить шину не увеличивать размер массивов, к которым осуществляется доступ за их пределами?В данный момент шина сообщает о более чем 750 предупреждениях, и у меня нет времени проверять каждое предупреждение одно за другим.