我是C的初学者,我遇到了一个错误,在某些时候,代码会在运行时停止应用程序。
int l = 0;
//block 1
char *primaryIPaddr;
unsigned char *primaryIPaddrSize;
primaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
if(primaryIPaddrSize != NULL) {
memcpy ( primaryIPaddr, &msg[l], primaryIPaddrSize );
AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
l += primaryIPaddrSize;
}
//block 2
char *secondaryIPaddr;
unsigned char *secondaryIPaddrSize;
secondaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "secondarySize: %u\n", secondaryIPaddrSize);
if(secondaryIPaddrSize != NULL) {
memcpy ( secondaryIPaddr, &msg[l], secondaryIPaddrSize );
AddToLog(logInfo, "secondaryAddr: %s\n", secondaryIPaddr);
l += secondaryIPaddrSize;
}
//block 3
unsigned int *primaryPort;
unsigned int *secondaryPort;
primaryPort = *(unsigned int *) &msg[l++];
AddToLog(logInfo, "primaryPort: %u\n", primaryPort);
secondaryPort = *(unsigned int *) &msg[l++];
AddToLog(logInfo, "secondaryPort: %u\n", secondaryPort);`
msg变量是一个由UDP数据包填充的字符,我不知道我的代码有什么问题,但是当进程到达块2时它就停止了,听起来像是内存问题,因为我删除了块如图1所示,并且将l变量推进到块2的精确点,块2正确地处理和转储,就像块2停止处理之前的块1一样。所以代码本身没关系,似乎我没有正确分配内存,我试图使用malloc,但没有做任何影响所以,我不知道我做得对不对,有人知道答案这可能会发生什么?
UDP数据包就是这样的:
UINT8 primaryIPaddrSize;
UINT8* primaryIPaddr; primaryIPaddrSize bytes
UINT8 secondaryIPaddrSize;
UINT8* secondaryIPaddr; secondaryIPaddrSize bytes
UINT16 primaryIPport;
UINT16 secondaryIPport`
secondaryIp是可选的,所以如果secondaryIPaddrSize为null,那么我必须跳过secondaryIPaddr。
答案 0 :(得分:2)
你的'阻止1'有几个问题。您需要打开编译器警告,或注意它给你的那些警告。
char *primaryIPaddr;
unsigned char *primaryIPaddrSize;
primaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
if (primaryIPaddrSize != NULL) {
memcpy(primaryIPaddr, &msg[l], primaryIPaddrSize );
AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
l += primaryIPaddrSize;
}
您的'primaryIPaddrSize'是char *
(地址),但在memcpy()
中,您将其用作长度。 primaryIPaddrSize
的任务很奇怪;您应该收到有关为指针分配char
的警告。鉴于赋值,memcpy()
长度为'OK',但这很奇怪。你应该写:
unsigned char primaryIPaddrSize = msg[l++];
另一个问题(我将要诊断 - 可能还有其他问题)是你的memcpy()
正在复制到不确定的内存。您尚未初始化primaryIPaddr
,因此它可能指向内存中的任何位置。
您必须始终确保知道数据的存储位置。可以说,你需要:
char *primaryIPaddr = malloc(primaryIPaddrSize);
然后进行记忆检查。
char *primaryIPaddr;
unsigned char primaryIPaddrSize = msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
char *primaryIPaddr = NULL;
if (primaryIPaddrSize != 0)
{
primaryIPaddr = malloc(primaryIPaddrSize);
if (primaryIPaddr == 0)
...handle out of memory...
memcpy(primaryIPaddr, &msg[l], primaryIPaddrSize );
AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
l += primaryIPaddrSize;
}
块2中的问题与块1中的问题非常对称,但您已经通过将数据复制到未知位置来破坏系统。块3中的代码不再需要指针。此外,端口号通常是2个字节(0..65535),但您的代码只能处理1个字节的端口号(因此您不会支持HTTPS,以及其他服务)。