У меня есть следующий фрагмент кода C и должен определить ошибку и предложить способ написания его более безопасно:Как можно записать этот фрагмент C более безопасно?
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Таким образом, ошибка является то, что StrLen игнорирует завершающий '\0'
строки и, следовательно, не является будет выделено достаточно памяти для копии, но я не уверен, что они собираются писать более безопасно?
Я мог бы просто использовать malloc(strlen(somestring)+1))
Я предполагаю, но я думаю, что должен быть лучший способ, чем это?
EDIT: ОК, я принял ответ, я подозреваю, что решение strdup не было бы ожидать от нас, как это не является частью ANSI C. Это кажется довольно субъективный вопрос, поэтому я Я не уверен, что то, что я принял, на самом деле самое лучшее. В любом случае, спасибо за все ответы.
+1 для использования strncpy. Это источник стольких дыр в безопасности, это не смешно. –
Использование strncpy() плохо хуже, чем использование strcpy(). Если вы используете strncpy(), вы являетесь * NOT * гарантированным выходом с нулевым завершением (этот пример в порядке, но не в целом). Кроме того, если вы используете избыточные буферы и sizeof (буфер) для третьего параметра strncpy(), у вас есть мини-катастрофа производительности на ваших руках; strncpy() ревностно обнуляет скопированные данные во всю длину. * ДА *, чтобы знать длину источника и целевых строк; если вы сделаете это правильно, использование strcpy() безопасно и безопаснее, чем слепое использование strncpy(). (Если это какая-либо помощь, strncat() намного хуже, чем strncpy(), никогда не используйте его!) –
Jonathan, strlcpy() гораздо более разумно. Я использую его всякий раз, когда он доступен, и когда-то я привожу версию, когда это не так. Слишком плохо Drepper - такая дорка. – dwc