Безопасные аналоги Итоа ()?
Я конвертирую какую-то старую программу на c в более безопасную версию. Следующие функции используются интенсивно, кто-нибудь может сказать мне их безопасные аналоги? Либо функции Windows, либо функции библиотеки времени выполнения C. Благодарю.
itoa()
getchar()
strcat()
memset()
3 ответа
itoa()
безопасен, пока буфер назначения достаточно велик, чтобы получить максимально возможное представление (т. е. INT_MIN с завершающим NUL). Итак, вы можете просто проверить размер буфера. Тем не менее, это не очень хорошая функция для использования, потому что если вы измените свой тип данных на больший целочисленный тип, вам нужно изменить на atol
, atoll
, atoq
и т. д. Если вам нужен динамический буфер, который обрабатывает любой тип, который вы выбрасываете, с меньшими проблемами обслуживания, рассмотрите std::ostringstream
(от <sstream>
заголовок).
getchar()
не имеет "безопасного аналога" - это небезопасно с самого начала и не имеет потенциала переполнения буфера.
ре memset()
: это опасно тем, что принимает мнение программистов о том, что память должна быть перезаписана без какого-либо подтверждения содержимого / адреса / длины, но при правильном использовании это не оставляет проблем, а иногда это лучший инструмент для работы даже в современном программировании на C++. Чтобы проверить проблемы безопасности с этим, вам нужно проверить код и убедиться, что он нацелен на подходящий буфер или объект, который должен быть 0ed, и что длина вычислена правильно (подсказка: используйте sizeof, где это возможно).
strcat()
может быть опасным, если соединяемые строки не помещаются в буфер назначения. Например: char buf[16]; strcpy(buf, "one,"); strcat(buf, "two");
все абсолютно безопасно (но хрупко, поскольку дальнейшие операции или изменение любой строки могут потребовать более 16 символов, и компилятор не предупредит вас), тогда как strcat(buf, argv[0])
не является. Лучшей заменой, как правило, является std::ostringstream, хотя это может потребовать существенной переработки кода. Вы можете уйти, используя strncat()
или даже - если он у вас есть - asprintf("%s%s", first, second)
, который будет выделять необходимый объем памяти в куче (не забудьте free()
Это). Вы также можете рассмотреть std::string и использовать operator+ для объединения строк.
Ни одна из этих функций не является "небезопасной", если вы понимаете поведение и ограничения. itoa
не является стандартным C и должен быть заменен на sprintf("%d",...)
если это тебя беспокоит.
Все остальные в порядке с опытным практикующим. Если у вас есть конкретные случаи, которые вы считаете небезопасными, вы должны опубликовать их.
Я бы изменил itoa(), потому что это не стандартно, с sprintf или, что лучше, snprintf, если ваша цель - безопасность кода. Я бы также изменил strcat() с помощью strncat(), но, поскольку вы также указали язык C++, лучше было бы использовать класс std::string.
Что касается двух других функций, я не могу понять, как вы могли бы сделать код более безопасным, не видя ваш код.