2014-04-24 32 views
0

我反编译了一个应用程序,我不知道真正的数组大小,所以我做了它很大,但我不知道我需要做的是我知道它将在使用strcpy之前,或者我必须考虑大小还有strcpyC strcpy是否需要特定的缓冲区大小或仍然有效?

signed int __cdecl SendSomePacket(struct CONNECTION* conn, int a1, int a2, const char *a3) 
{ 
    //char buf[256]; // [sp+10h] [bp-9h]@1 
    char buf[10]; // [sp+10h] [bp-9h]@1 

    *(unsigned int *)&buf[1] = a1; 
    *(unsigned int *)&buf[5] = a2; 
    strcpy(&buf[9], a3); 
    buf[0] = 0xEu;        // Packet Type 
    return SendPacket(CONNECTION->socket, buf, strlen(a3) + 10, 1); 
} 

请问我应该把它与256这是猜测的由默认的大小总是2像256,512,1024,2048乘..

char buf[256]; // [sp+10h] [bp-9h]@1 

,或者我应该做它作为尽可能小以节省内存。

char buf[10]; // [sp+10h] [bp-9h]@1 

我的strlen(a3)这个数字后想通是缓冲区应为多大。

我试过strcpy,缓冲区大小为10 ..我放入一个长度超过500的字符串,它的工作可能只是运气好。我只想知道是否应该为初始数据包+ strcpy的数据或仅用于数据包的足够大的静态缓冲区?无论如何,数据包可能会被附加。

这是我试过的一个例子。

http://ideone.com/w7DsCl

+1

您的'strcpy'调用将写入'strlen(a3)+ 1'字符,如果字符数很小,可能会超出数组buf的末尾。 '+ 1'用于字符串终止符,'strcpy'将始终写入。 –

回答

3

因为有源字符串中它会尽可能多的字符复制。它不知道目标缓冲区有多大,如果你给它一个太长的源字符串,它会覆盖到随机区域。没有“默认大小”,绝对没有涉及“猜测”。

要小心,听起来好像你对基本的工作方式不是很清楚。

如果您已经知道源的长度,最好使用memcpy()

+0

我尝试了strcpy,缓冲区大小为10 ..我放了一个长度超过500的字符串,它的工作可能只是运气好。我只想知道是否应该为初始数据包+ strcpy的数据或仅用于数据包的足够大的静态缓冲区?无论如何,数据包可能会被附加。 http://ideone.com/w7DsCl – user3435580

+0

@ user3435580是的,你只是幸运,那是未定义的行为,非常危险。 – unwind

+0

好的,这就是我想知道的所有谢谢。我将使它和字符串一样大,以便可能进入函数+数据包本身。 – user3435580

1

我认为如果您使用动态内存分配使用malloc会更好。

这样做:

char *buf = malloc(strlen(s3) + 1 + sizeof(a1) + sizeof(a2));

然后

sprintf(buf, "%u%u", a1, a2);
strcpy(buf + 8, a3); // Assuming sizeof(u_int) == 4

这将是内存使用效率。使用后请记住freebuf

+0

这很好,但很明显,代码写入的不仅仅是'buf'字符串,所以这个解决方案需要修改。 – unwind

+0

雅但我需要释放'strdup'? – user3435580

+1

@ user3435580:是的,那是你需要照顾的一件事。 –

1

strcpy将写入尽可能多的byes作为源字符串的长度,因此它将超出您的缓冲区大小。所以最好使用更大尺寸的数组或使用动态内存分配。

1

很多关于strcpy()是一个不安全的函数的困惑批评来自这样使用它。

在调用strcpy()之前,您需要知道要复制的数据的大小。如果你事先不知道这个,你必须在调用strcpy()之前调用strlen()来查找。否则你的程序容易受到缓冲区溢出的影响。

如果确实知道大小,strcpy()可以完全安全地使用。