我被问到这段代码有什么问题

时间:2019-04-15 17:02:28

标签: c

#include <string.h>

void foo (char *bar)
{

    char c[12];
    strcpy(c, bar);

}
int main (int argc, char **argv)
{

    foo(argv[1]);
    return(1);

}

1 个答案:

答案 0 :(得分:2)

有两个问题:

  • 如果程序没有参数argv[1]为NULL,并且在 foo 中,您执行的strcpy(c, NULL);行为未定义(通常是崩溃)。
  • 如果程序的firs参数至少包含12个字符,strcpy(c, bar);将在 c 中写出,同样具有未定义的行为。

我并不是说 strcpy 在最好的情况下是无用的,因为 c 之后没有使用

经过最少更改的程序的安全版本为:

#include <string.h>

void foo (char *bar)
{
  char c[12];

  strncpy(c, bar, sizeof(c) - 1);
  c[sizeof(c) - 1] = 0;
}

int main (int argc, char **argv)
{
  if (argc >= 2)
    foo(argv[1]);
  return(1);
}