c ++ printf вопрос: как я могу безопасно передать char * в printf? - PullRequest
1 голос
/ 02 февраля 2011
const char* abc = "foo";
printf(abc);

Это безопасно или правильно?Я видел какой-то старый код, включая этот.Спасибо!

Очень, очень жаль .. Я сделал ошибку, я вернул ее обратно ...

Ответы [ 4 ]

7 голосов
/ 02 февраля 2011

Нет, это не безопасно. Предполагая, что abc указывает на допустимую строку (чего в настоящее время нет), этот тип шаблона может быть подвержен уязвимости форматной строки. См. Формат строки атаки

edit: я вижу, что вы исправили код в своем вопросе. Раньше abc передавалось в качестве первого аргумента printf, что действительно очень плохо. Теперь, когда вы сделали первый аргумент "%s", все стало намного лучше. Эти два не похожи и имеют огромную разницу в безопасности, так что ищите этот шаблон в своем устаревшем коде.

4 голосов
/ 02 февраля 2011

Я предполагаю, что ваши abc указывают на фактическую строку, а не на ничего. Очистка вашего примера кода будет полезна.

В прошлом я делал это для записи статической строки и никогда не сталкивался с проблемой. Оглядываясь назад, мне повезло. Чтобы быть правильным, это должно выглядеть примерно так:

const char* abc = "foo";
printf("%s", abc);
1 голос
/ 02 февраля 2011

трудно отличить от ограниченного фрагмента кода в ваших вопросах

, но, зависит ... printf будет печатать его как строку формата ..... так что пока он не используетформатировать строку спецсимволами будет нормально ...

0 голосов
/ 02 февраля 2011

Для

const char* abc = "foo";
printf(abc);

Я не вижу причин, по которым нужно вводить переменную abc, потому что 2 строки очень близки.

Если abc не является указателем строки const, то это очень опасно. Поскольку printf использует список аргументов, который сам по себе не является безопасным типом, очень легко вызвать сбой или подобное.

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