Я создал класс с вариационным шаблоном. Этот метод вызывает функцию printf
. При передаче нулевых аргументов методу, я получаю предупреждение компиляции gcc, говорящее:
warning: формат не строковый литерал и аргументы формата [-Wformat-security]
Пример упрощенного класса:
class printer{
std::map<int,std::string> str;
public:
printer(){
str[0] = "null\n";
str[1] = "%4d\n";
str[2] = "%4d %4d\n";
str[3] = "%4d %4d\n%4d\n";
}
template<typename ...Args>
void print(Args... args){
printf(str[sizeof...(args)].c_str(),args...);
}
};
При использовании
printer p;
p.print(23);
p.print(345,23);
все компилируется плавно, но при использовании
printer p;
p.print();
Я получаю предупреждение компиляции
main.cpp: In instantiation of ‘void printer::print(Args ...) [with Args = {}]’:
main.cpp:23:11: required from here
main.cpp:17:50: warning: format not a string literal and no format arguments [-Wformat-security]
printf(str[sizeof...(args)].c_str(),args...);
Конечно, если я просто позвоню
printf("null\n");
не появляется предупреждение.
Может ли кто-нибудь объяснить, почему это происходит?
Можно ли удалить предупреждение, не отключая флаг -Wformat-security
?