itoa()的安全对应物?

smw*_*dia 2 c c++

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

itoa()
getchar()
strcat()
memset()
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 8

itoa()只要目标缓冲区足够大以接收最大可能的表示(即具有尾随NUL的INT_MIN),则是安全的.因此,您只需检查缓冲区大小即可.不过,这是不使用,因为如果你改变你的数据类型为较大的整型,您需要更改到一个非常好的功能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 +来连接字符串.