Отсутствует предупреждение о спецификаторе формата в контексте шаблона - PullRequest
0 голосов
/ 03 декабря 2018

Следующий код выдает предупреждение о неверном спецификаторе формата во всех основных компиляторах

std::wstring ws = L"some example string";
char buff[100];
sprintf(buff, "%s", ws.c_str());

Предупреждение исчезает, если мы используем его в контексте 'variadic' (шаблон variadic или va_list).

std::wstring ws = L"some example string";

void foo_va_list(const char* fmt, ...)
{
    va_list argv;
    va_start( argv, fmt );

    char buff[1000];
    vsprintf(buff, fmt,  argv);

    va_end(argv);
}

template<typename ... T>
void foo_variadic_template(const char* fmt, T && ...  args)
{
    char buff[100];
    sprintf(buff, fmt,  args...);
}


int main()
{
    //this two should produce a warning but don't
    foo_va_list("foo_va_list %s", ws.c_str()); 
    foo_variadic_template("foo_variadic_template %s", ws.c_str()); 

    char buff[100];
    //this one produces warning as expected 
    sprintf(buff, "sprintf %s", ws.c_str());
}

Вопрос в том, как включить это предупреждение в этом контексте?

1 Ответ

0 голосов
/ 03 декабря 2018

некоторые компиляторы имеют расширение для функций [s]printf и могут «понимать» заданную строку формата и сверять спецификатор используемого формата с используемыми аргументами.

Очевидно, что эти проверки не могут работать, если вы скрываете это отношение в своей собственной реализации.

...