2017-04-21 147 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; 
}