在缓冲区溢出的C中使用sprintf的副作用

时间:2016-07-16 18:18:48

标签: c coding-style

以下是否会导致问题?

my_func()
{
  char date_field[11];
  time_t current_time;

  time(&current_time);

  sprintf(date_field, "%0.3d%0.3d%.02d%0.2d\0", current_time.tm_yday,
      current_time.tm_year, current_time.tm_hour, current_time.tm_min);

  ...
}

我意识到这个可能超出了date_field缓冲区......我关心的是这种情况发生的副作用?即:核心转储?如何捕捉/捕获这类问题?

1 个答案:

答案 0 :(得分:1)

按照目前的说法,您的代码无法编译:{{1​​}}是current_time,而不是time_t。如何计算struct tm结构以及如何使用它?如果未正确初始化此结构,tm可能会调用未定义的行为,这意味着任何事情都可能发生,但这会要求某些字段超出范围。

尝试从这么小且不准确的代码片段中详细说明副作用是徒劳的。

通过使缓冲区变大来修复代码,并使用sprintf()代替snprintf并确保正确计算sprintf结构。即使没有缓冲区溢出,无效的tm字符串也可能导致代码或数据库本身的其他问题......发布更多代码有助于调查。

您对实际崩溃有更多了解吗?你有注册转储吗?