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

У меня есть пример команды 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/

Другие вопросы по тегам