Проблема покрытия: копия перекрывающейся памяти (OVERLAPPING_COPY) в операторе sprintf - PullRequest
1 голос
/ 24 января 2020
char arr[512];
...
sprintf(arr, "%s %30s", arr, "Some Text");

Я получаю следующее сообщение для оператора sprintf: При вызове функции sprintf аргументы arr и arr могут указывать на один и тот же объект.

Есть ли другой способ реализовать это вид форматирования?

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Предупреждение о перекрытии связано с тем, что вы копируете arr в себя, перезаписывая его содержимое.

Кроме того, в коде:

sprintf(arr, "%s %0x", arr);
                  ^^^

%s принимает строку arr, но %0x не принимает шестнадцатеричную целочисленную переменную без знака, как следует, поэтому вы, вероятно, пропускаете параметр.

Что-то вроде:

char arr[512];
char arr2[1024];
unsigned int x = 15;
sprintf(arr2, "%s %0x", arr, x);
1 голос
/ 29 января 2020

Этот код содержит две несвязанные ошибки. Что касается анализатора PVS-Studio, он выдает два следующих предупреждения:

  • V576 Неверный формат. При вызове функции sprintf ожидается другое количество фактических аргументов. Ожидаемое: 4. Настоящее время: 3. test. cpp 54
  • V541 Опасно печатать строку 'arr' в себя. test. cpp 54

Первый означает, что функции передано недостаточное количество фактических аргументов. Действительно, строка формата указывает, что строка и целое число ожидаются в качестве аргументов. Но только строка передается. Аргумент нумерация c отсутствует, что приводит к использованию объема памяти со случайным значением и, следовательно, неопределенным поведением.

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

Поэтому Coverity абсолютно прав, когда выдает предупреждение для этого кода. Код определенно неверный.

PS Он напомнил мне еще один забавный случай, связанный с использованием " fake sprintf ":).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...