2017-04-21 148 views
-1
#include <string.h> 

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

    strcpy(c, bar); // no bounds checking 
} 

int main (int argc, char **argv) 
{ 
    foo(argv[1]); 

    return 0; 
} 
+4

“如何使这个代码利用IF..Statement缓冲区溢出的安全”,没有必要为一个if语句,只需使用['strncpy'(HTTPS:/ /linux.die.net/man/3/strncpy),而不是:-) – George

+0

提示您可能还需要检查参数是否的确存在。 – sjsam

+0

注意,仅仅是避免缓冲区溢出并不能保证你的程序实际上会做正确的事。无论您选择何种策略来防止缓冲区在任何特定情况下溢出,都应该与程序目的和规范保持一致。 –

回答

-2

,使这个代码缓冲区溢出的安全我做了它的安全。否则,它的功能与原来的应用程序完全相同,即:无。

int main (int argc, char **argv) 
{ 
    return 0; 
} 
+0

那么,如果程序运行,程序会做些什么,并且输出取决于任何'argv [1]'是不确定的,因为它可以调用UB。 – George

+0

@George:你的观点是? –

+0

“它的功能与原来的应用程序完全相同,即:没有任何功能。”是不正确的,程序确实做了一些事情,甚至有输出的机会。 – George

2

另一个实际选项:

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

    snprintf(c, sizeof c, "%s", bar); 
} 

功能strncpy不保证生成的字符串由NULL character终止,因此,你可以有一个bad resulting string.

0

检查是否长度该bar小于length of c

代码:

#include <string.h> 

void foo (char *bar) 
{ 
    char c[12]; 
    if (strlen(bar) < sizeof c) { 
     printf("avoiding buffer overflow"); 
     strcpy(c, bar); 
    } 
} 

int main (int argc, char **argv) 
{ 
    foo(argv[1]); 

    return 0; 
}