gpt4 book ai didi

c++ - itoa() 的安全对应物?

转载 作者:太空狗 更新时间:2023-10-29 23:31:32 27 4
gpt4 key购买 nike

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

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

最佳答案

itoa()只要目标缓冲区足够大以接收最大可能的表示(即带有尾随 NUL 的 INT_MIN),它就是安全的。因此,您可以简单地检查缓冲区大小。不过,这不是一个很好用的函数,因为如果将数据类型更改为更大的整数类型,则需要更改为 atol。 , atoll , atoq等等.. 如果你想要一个动态缓冲区来处理你扔给它的任何类型并且维护问题更少,请考虑 std::ostringstream (来自 <sstream> header )。

getchar()没有“安全对应物”——它一开始就不是不安全的,也没有缓冲区溢出的可能性。

回复 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+ 来连接字符串。

关于c++ - itoa() 的安全对应物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com