我正在将一些旧的c程序转换为更安全的版本。以下功能被大量使用,有人能告诉我他们的安全对应物吗? Windows函数或C运行时库函数。感谢。
itoa()
getchar()
strcat()
memset()
答案 0 :(得分:8)
itoa()
是安全的。因此,您只需检查缓冲区大小即可。尽管如此,使用它并不是一个非常好的功能,因为如果您将数据类型更改为更大的整数类型,则需要更改为atol
,atoll
,atoq
等。如果您想要一个动态缓冲区来处理你抛出的任何类型,而且维护问题较少,请考虑std::ostringstream
(来自<sstream>
标题)。
getchar()
没有“安全对手” - 开始时并不安全,并且没有缓冲区溢出潜力。
Re memset()
:它是危险的,它接受程序员的判断,应该覆盖内存而不确认内容/地址/长度,但如果使用得当,它不会留下任何问题,有时它是最好的工具即使在现代C ++编程中也能胜任这项工作。要检查安全性问题,您需要检查代码并确保它针对合适的缓冲区或对象进行处理,并且正确计算长度(提示:尽可能使用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 +来连接字符串。
答案 1 :(得分:4)
如果您了解行为和限制,这些功能都不会“不安全”。 itoa
不是标准C,如果您担心这一点,则应替换为sprintf("%d",...)
。
其他人对经验丰富的从业者都很好。如果您认为可能不安全的特定情况,您应该发布它们。
答案 2 :(得分:1)
我会改变itoa(),因为它不是标准的,如果您的目标是代码安全性,那么使用sprintf或更好的snprintf。我也用strncat()更改strcat()但是,既然你也指定了C ++语言,那么真的更好的想法是使用std :: string class。
至于其他两个功能,我看不出如何在不看代码的情况下使代码更安全。