Ответ 1
Это ожидаемое предупреждение, если мы посмотрим на документ для - Wformat-security, он говорит:
-Wformat-безопасности Если задан -Wformat, также предупреждайте об использовании функций формата, которые представляют возможные проблемы безопасности. В настоящее время предупреждает о вызовах функций printf и scanf, где строка формата не является строковым литералом, и нет аргументов формата, как в printf (foo);. Это может быть отверстие безопасности, если строка формата поступает из ненадежного ввода и содержит `% n '. (В настоящее время это подмножество того, что предупреждает -Wformat-nonliteral, но в будущем предупреждения могут быть добавлены в -Wformat-security, которые не включены в -Wformat-nonliteral.) -Wformat = 2
когда вы не передаете никаких аргументов, так как результат c_str()
не является строковым литералом.
Этот случай:
printf("null\n");
не предупреждает, потому что "null\n"
- строковый литерал, который не может быть введен пользователем.
Мы можем понять, почему это потенциальная проблема безопасности из этой % n спецификатора формата, предоставляющей разные выходные данные для разных компиляторов. Почему?.
Похоже, вам нужно включить определенные переключатели, если вы не хотите, чтобы все -Wformat-secrity
:
-Wformat включен в -Wall. Для большего контроля над некоторыми аспектами проверки формата параметры -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security и -Wformat = 2 доступны, но не включены в -Wall.
Хотя это плохой вариант, если -Wformat-secrity
добавляет дополнительные параметры позже, вам необходимо постоянно обновлять.
Другая альтернатива, упомянутая в упоминании AndyG, будет перегрузкой:
void print(){
std::printf("null\n");
}