0

我是 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 为空,那么我必须跳转secondaryIPaddr。`

4

1 回答 1

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是奇怪的;您应该收到有关将 a 分配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;
}

Block 2 中的问题与 Block 1 中的问题几乎对称,但是您已经通过将数据复制到未知位置而破坏了系统。块 3 中的代码再次不需要指针。此外,端口号通常为 2 个字节 (0..65535),但您的代码似乎只处理 1 个字节的端口号(因此您将不支持 HTTPS 以及其他服务)。

于 2013-10-12T13:53:11.603 回答