题
我最近完成了一个大学课程。因此,我缺少经验,当然。
一些大学往往以教他们的学生安全的编程, 或者至少一些元素.还有 甚至一个视频 (取自 在这里,).
正在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;
}
也许你会发现有用的阅读答案这个问题一>