繁体   English   中英

C:一种检查缓冲区中的函数并将其追加的更安全方法?

[英]C: A safer way to check buffer in function and append to it?

我有一个需要返回另一个日志记录功能时间的函数,它看起来像这样:

//put time in to buf, format 00:00:00\0
void gettimestr(char buf[9]) {
  if(strlen(buf) != 9) { //experimental error checking
    fprintf(stderr, "Buf appears to be %d bytes and not 9!\n", strlen( buf ));
  }
  time_t cur_time;
  time(&cur_time);
  struct tm *ts = localtime(&cur_time);
  sprintf(buf, "%02d:%02d:%02d",
        ts->tm_hour,
        ts->tm_min,
        ts->tm_sec );
  strncat(buf, "\0", 1);
}

现在,我想主要的问题是检查缓冲区是否足够长,sizeof()返回指针大小,strlen似乎在两个不同的调用中随机返回0或诸如12之类的值。

我的第一个问题是,我如何能够安全地检测缓冲区的大小,这可能吗?

我的另一个问题是,接受buf [9]是一种有利的方法还是应该接受指向缓冲区的指针,并使用strcat()而不是sprintf()来增加时间? 尽管sprintf似乎只接受一个字符数组而不接受一个指针,但它更易于将零填充到时间值。

您的函数假定传入的缓冲区已经包含一个以9个字符为结尾的空终止字符串。 那没有道理。

正确的方法是请求大小作为参数:

void gettimestr(char *buf, int bufferSize) {

并使用snprintf:

snprintf(buf, bufferSize, "%02dx....", ....);<sub>*</sub>

并终止字符串,因为如果超出限制,snprintf将不会执行此操作:

 
 
 
  
  buf[bufferSize-1] = 0;
 
  

您可以这样调用函数:

char buffer[16];
gettimestr(buffer, sizeof(buffer));

没有其他方法可以确定大小。 这不是Java知道数组大小的地方。 传递char *只会将指针向下发送到该函数,而没有更多信息,因此,获取缓冲区大小的唯一方法是要求调用者指定它。

(编辑:snprintf应该始终正确终止字符串,如注释中所指出。)

@EboMike是正确的。 只是为了补充他的答案,您可以使用以下方法检查缓冲区:

void gettimestr(char *buf, int bufferSize) {
    if (!buf) {
        fprintf(stderr, "Null buffer\n");
        return;
    }

 // rest of the code

 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM