如何防止 char 指针缓冲区溢出?

4
即 -
int function(char* txt)
{
   sprintf(txt, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
}

如果表格中的文本长度为500个字符,而主体中定义的文本长度只有100个字符……

谢谢。


11
我希望表格中的文本不是来自Bobby Tables。 - Maciej Hehl
3
NUL是表示'\0'的字符,而NULL是未初始化的指针。 - detly
3个回答

11

你需要:

  • 给函数添加一个参数,用于指定缓冲区的大小
  • 使用 snprintf() 替代 sprintf()
  • 检查 snprintf() 的返回值,以确定所需格式化数据的缓冲区大小;如果其大于或等于缓冲区大小,则应适当处理(缓冲区仍将以 null 结尾,但内容将被截断以适应缓冲区大小;是否可行或错误完全取决于使用情况)

(另外,你的函数需要一个返回类型...)


谢谢,我不确定是否还有其他方法。 - T.T.T.

3

您应该能够使用snprintf来限制使用的缓冲区的大小。

function(char* txt, size_t length)
{
   int rv;
   rv = snprintf(txt, length, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
   if (rv >= length) {
       // error
   }
}

1
你确实需要检查 snprintf() 的返回值 - 如果发生截断,那么这显然是需要处理的错误。 - caf

0
关于唯一能做的事情就是分配足够的内存,将字符串格式化到该内存中,并返回指向它的指针。调用函数应负责在完成后释放内存。

你可以做得比那更多。 - WhirlWind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接