我最近完成了一个大学课程。因此,我缺少经验,当然。

一些大学往往以教他们的学生安全的编程, 或者至少一些元素.还有 甚至一个视频 (取自 在这里,).

正在C、复制串,需要-我知道-本或串。h功能。你怎么使用它安全地在每日编程?你有一些功能,其处理分配,以防止缓冲区溢?还有 证书的安全编码标准适用于C.它提供例和兼容的方案:

int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[128];
  strcpy(prog_name, argv[0]);
  /* ... */
}

和他们的替换为:

int main(int argc, char *argv[]) {
  /* ... */
  char *prog_name = (char *)malloc(strlen(argv[0])+1);
  if (prog_name != NULL) {
    strcpy(prog_name, argv[0]);
  }
  else {
    /* Couldn't get the memory - recover */
  }
  /* ... */
}

取自这里, 2例.

但我得到它,只是更具挑战性,更加代码,更多的工作。为什么没有一个改变的图书馆本身?或者至少为什么没有人提供一个安全的替代图书馆或功能,处理这个在正确的方式?

谢谢你读书, wishi

有帮助吗?

解决方案

在POSIX函数为这个(几乎所有的系统上可用的)是strdup()strcpy()使用,如果你不想分配新的内存,而且已经有您想要使用的缓冲区,但你更好地了解如何之大,缓冲区,如果字符串中它适合。如果你不知道该字符串适合,有strncpy(),只是拷贝给定数量的字符。所以,你可以复制的金额限制对缓冲区的大小。

而除此之外的是,有很多刺库以不同的方式管理字符串大小。

既然你标记它的C ++:有std::string做所有的内存管理,为您和不给你这些问题

其他提示

OpenBSD的通常优于名词的功能,它们都更快和更容易使用(是strlcpy,strlcat提供)功能安全的,但它们是非标准的。然而,他们BSD许可证,以便您可以在任何程序中已知的良好执行,所以你既可以是跨平台的,安全的。

对于Windows,如果你不关心可移植性,可以使用* _s功能。

使用 strncpy

#define BUFSIZE 127
int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[BUFSIZE + 1];
  strncpy(prog_name, argv[0], BUFSIZE);
  progname[BUFSIZE]= '\0';
  /* ... */
}

*n*版本最str*功能。

如果我理解正确的话,你的真正的问题是,为什么API函数都不做更安全。

的一个原因的原因是,C库是遗留(太迟了修改)。

的主要原因,但是,是该库被设计成简约,以便它的最低限度,这是用户的责任,以确保其被正确地调用。如果是做任何过多的检查,那么价格将支付每次调用时,即使用户可以保证对没有问题将要发生其他原因。这是非常非常普遍在许多API。

话虽这么说,有足够的库,提供更安全的替代,他们只是不属于标准库的一部分。此外,许多人谁与C ++,有许多的那些东西的标准类库做更高层次的东西的工作。

其实,微软也提供对CRT功能安全的替代品。每个人都知道我恨他们,但并禁用,你不应该使用旧功能的警告。如果你想要的东西安全,也许你应该使用C ++。然后或者STL字符串或类似的东西的Qt

好,或者你去像.NET或Java,它通常不会从这些问题的困扰(您的应用程序可能会崩溃,但没办法通过一个缓冲区溢出代码注入到您的应用程序)。

平台

编辑: 随着数据执行保护/ NX启用(默认为Vista和.NET),这不应该是传统平台的问题也是如此。

int main
(
    int argc, 
    char *argV[]
) 
{
   char prog_name[128];
   if (strlen(argV[0]) < sizeof(prog_name))
   {
       strcpy(prog_name, argV[0]);
   }
   else
   {
       printf("%s is too large for the internal buffer\n", argV[0]);
   }

   return 0;
}

也许你会发现有用的阅读答案这个问题

scroll top