Почему некоторые инструменты статического анализа не сообщают о потенциальных переполнениях буфера?

У меня есть пример команды strcpy, в которой есть риск переполнения буфера, но PVS-Studio не выдает предупреждения. В моем примере strcpy используется для копирования аргумента командной строки в буфер без проверки размера аргумента командной строки. Это может привести к переполнению буфера, если аргумент превышает размер буфера.

Пример кода:

char carg1[13];
int main(int argc, char* argv[])
{
// Get name from the 1st command line arg
       strcpy(carg1, argv[1]);
…
}

Размер argv[1] не проверяется перед копированием в carg1. Разве это не должно вызвать предупреждение?


person Sam Johnson    schedule 11.02.2013    source источник


Ответы (2)


Теоретически невозможно построить идеальный инструмент статического анализа (это следует из таких результатов, как неразрешимость проблемы остановки). В результате все инструменты статического анализа в лучшем случае являются эвристиками, которые могут пытаться обнаружить определенные классы ошибок, но даже в этом случае они не обязательно могут обнаружить все эти ошибки.

Так что да, код, который вы получили выше, выглядит так, как будто он имеет потенциальное переполнение буфера. Честно говоря, я не знаю, почему этот конкретный инструмент не может обнаружить ошибку, но я предполагаю, что внутренняя эвристика, которую использует анализатор, по какой-то причине не может ее обнаружить.

Надеюсь это поможет!

person templatetypedef    schedule 11.02.2013
comment
На самом деле можно создать инструмент, обнаруживающий все возможные ошибки в программе. Просто пометка всех инструкций как потенциально проблематичных отвечает всем требованиям, хотя и очень разочаровывающим образом. Чего вы не можете написать, так это анализатора, который и правильный, и полный, т.е. который обнаруживает только реальные ошибки, и только те. Чтобы преодолеть эту невозможность, статические анализаторы делают выбор между тем, чтобы быть правильными (отмечая все возможные ошибки, но выдавая потенциально много ложных сигналов тревоги для некоторых кодов) или ненадежными (т. е. пропуская некоторые ошибки). Вторая категория гораздо более распространена. - person byako; 13.02.2013
comment
@BorisYakobowski- Абсолютно. Я действовал исходя из предположения о надежности, что в ретроспективе, вероятно, было не очень хорошим. Спасибо, что добавили это! - person templatetypedef; 13.02.2013

Есть 3 факта:

1) Если вы используете компилятор Visual C++, вы получите предупреждения компилятора 4996.

1>robust.cpp(529): предупреждение C4996: 'strcpy': эта функция или переменная могут быть небезопасными. Вместо этого рассмотрите возможность использования strcpy_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. Смотрите справку для деталей. 1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\string.h(110): см. объявление 'strcpy'

2) PVS-Studio изначально работал только с Visual Studio.

3) Политика PVS-Studio заключается в реализации диагностических правил, которые не являются дублирующими предупреждениями компилятора.

Так что кажется логичным, что PVS не проверяет случай, который уже давно проверен компилятором Microsoft (начиная с VS2005).

Обновлено: Наконец, в PVS реализовано такое диагностическое правило: https://www.viva64.com/en/w/V755/print/

person Andrey    schedule 13.03.2017