Почему некоторые инструменты статического анализа не сообщают о потенциальных переполнениях буфера?
У меня есть пример команды 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. Разве это не должно вызывать предупреждение?
2 ответа
Теоретически невозможно создать идеальный инструмент статического анализа (это следует из результатов, таких как неразрешимость проблемы остановки). В результате все инструменты статического анализа в лучшем случае являются эвристиками, которые могут пытаться обнаружить определенные классы ошибок, и даже тогда не всегда могут обнаружить все эти ошибки.
Так что да, код, который вы получили выше, выглядит так, как будто он потенциально переполнен буфером. Честно говоря, я не знаю, почему этот конкретный инструмент не может обнаружить ошибку, но я предполагаю, что внутренняя эвристика, используемая анализатором, по какой-то причине не может обнаружить ее.
Надеюсь это поможет!
Есть 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/