itoa()的安全对应物?

时间:2010-11-10 07:18:41

标签: c++ c

我正在将一些旧的c程序转换为更安全的版本。以下功能被大量使用,有人能告诉我他们的安全对应物吗? Windows函数或C运行时库函数。感谢。

itoa()
getchar()
strcat()
memset()

3 个答案:

答案 0 :(得分:8)

只要目标缓冲区足够大以接收最大可能的表示(即具有尾随NUL的INT_MIN),

itoa()是安全的。因此,您只需检查缓冲区大小即可。尽管如此,使用它并不是一个非常好的功能,因为如果您将数据类型更改为更大的整数类型,则需要更改为atolatollatoq等。如果您想要一个动态缓冲区来处理你抛出的任何类型,而且维护问题较少,请考虑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。

至于其他两个功能,我看不出如何在不看代码的情况下使代码更安全。