Inefficient use of sprintf

Функциональный sprintf копии представляют в виде строки вместо более эффективного strcpy

Описание

Это средство проверки инициировано, когда вы используете функциональный sprintf скопировать строки.

Риск

Функциональный sprintf комплексная функция со списком аргументов переменной. Прежде, чем выполнить функцию, компилятор анализирует список аргументов, чтобы определить типы аргумента, который добавляет наверху к коду. Обработка различных форматов ввода, что sprintf поддержки делают функцию трудной оптимизировать. Например, даже если вы хотите скопировать только строки при помощи sprintf, функция должна все еще поддержать копирование целых чисел. Универсальность sprintf делает его менее эффективным и трудным оптимизировать. Используя sprintf для копирования строк делают ваш код неэффективным.

Исправление

Чтобы зафиксировать этот дефект, осуществите рефакторинг свой код и используйте выделенные функции, такие как strcpy и strcat или их варианты, чтобы скопировать строки.

Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.

Примеры

развернуть все

#include <string.h>
#include <stdio.h>

void foo(char* p1, const char* p2, const char* p3){
	//...
	sprintf(p1, "%s", p2); //Noncompliant
	sprintf(p1, "%s", "String");//Noncompliant
	sprintf(p1, "NoFormatting"); //Noncompliant
	sprintf(p1, ""); //Noncompliant
	sprintf(p1, "%s%s", p2, p3);//Noncompliant
}
void bar(char* p1, const char* p2, const char* p3){
	sprintf(p1, "%d", 5);//Compliant
	sprintf(p1, "%s%d", "String", 123);//Compliant
	int n = sprintf(p1, "%s", p2);//Compliant
}

В этом примере, струны до p2 и p3 копируются в p1 путем вызова sprintf. Поскольку sprintf используется для копирования строк в foo, Polyspace® флаги эти неэффективные вызовы. В функциональном barsprintf называется для форматирования строк. Когда вы используете sprintf для форматирования строк или использования возвращаемое значение функции, Polyspace не отмечает вызов как неэффективный.

Коррекция

Чтобы зафиксировать этот дефект, используйте выделенные функции копирования строки, такие как strcpy и strcat вместо sprintf когда вы копируете строки.

#include <string.h>
#include <stdio.h>

void foo(char* p1, const char* p2, const char* p3){
	//...
	strcpy(p1, p2); //Compliant
	strcpy(p1, "String");//Compliant
	strcpy(p1, "NoFormatting"); //Compliant
	*p1 = '\0';//Compliant
	strcpy(p1, p2); //Compliant
	strcat(p1, p3);
}

Информация о результате

Группа: Производительность
Language:C | C++
Значение по умолчанию: Off
Синтаксис командной строки: inefficient_sprintf
Удар: Средняя
Введенный в R2021b