Этот код содержит две несвязанные ошибки. Что касается анализатора PVS-Studio, он выдает два следующих предупреждения:
- V576 Неверный формат. При вызове функции sprintf ожидается другое количество фактических аргументов. Ожидаемое: 4. Настоящее время: 3. test. cpp 54
- V541 Опасно печатать строку 'arr' в себя. test. cpp 54
Первый означает, что функции передано недостаточное количество фактических аргументов. Действительно, строка формата указывает, что строка и целое число ожидаются в качестве аргументов. Но только строка передается. Аргумент нумерация c отсутствует, что приводит к использованию объема памяти со случайным значением и, следовательно, неопределенным поведением.
Второе предупреждение говорит о том, что нет гарантии, что функция sprintf
работает правильно, если один буфер используется как входной и выходной буфер. Такой код может работать правильно или нет. Все зависит от реализации функции sprintf
. В любом случае, нет смысла писать код таким образом.
Поэтому Coverity абсолютно прав, когда выдает предупреждение для этого кода. Код определенно неверный.
PS Он напомнил мне еще один забавный случай, связанный с использованием " fake sprintf ":).