在xcode上崩溃但在Windows上没有崩溃。 SIGABRT?

时间:2011-04-03 04:29:18

标签: c

我必须为我的C编程类编写一个程序,将IPV4地址转换为IPV6。我们提供了执行转换的功能(以下代码执行实际转换)。我运行此代码时在XCode中遇到问题。我已经使用了断点,并确定当它到达sprintf()行时它会崩溃。它崩溃了:Program received signal: “SIGABRT”. sharedlibrary apply-load-rules all。我在基于Windows的编译器上测试了完全相同的代码,运行正常。什么会导致它在一个而不是另一个上失败?我的程序必须在Windows上运行,而不是Mac用于评分过程,如果没有解决这个问题,那么我将在Windows上编写并编写其余的程序,但我更愿意使用Mac,所以任何帮助都是值得赞赏的。

    strncpy(IPV6, "0000:0000:0000:0000:0000:0000:", 30); 
    sscanf(input, "%u.%u.%u.%u", &a, &b, &c, &d); 
    sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d );
    strncat(IPV6, hexIP, 9); 

由于

修改

int makeIPV6(const char input[25], char IPV6[40], int style)  
{
        unsigned int a, b, c, d, e, f;
        char hexIP[9];
        char hexMAC[24];
        printf("Stage 2\n");
        strncpy(IPV6, "0000:0000:0000:0000:0000:0000:", 30);
        sscanf(input, "%u.%u.%u.%u", &a, &b, &c, &d);
        sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d );
        strncat(IPV6, hexIP, 9);

        return strlen(IPV6)
}

2 个答案:

答案 0 :(得分:6)

我看到缓冲区溢出:

char hexIP[9];
/*...*/
sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d );

您的格式字符串将产生9个字符,但sprintf将包含nul终结符。尝试制作hexIP十个字符。

在你试图把任何东西放进去之前,要注意Joey Adams所说的或memset(IPV6, '\0', 40)

答案 1 :(得分:4)

你已经陷入了strncpy恼人的警告,即如果一个空终结符不在字符串的前n个字节中,则不会将任何终结符附加到输出缓冲区。

char buffer[999];
strcpy(buffer, "xxxxxxxxxx");
strncpy(buffer, "12345", 5);
puts(buffer);

这会打印12345xxxxx而不是12345

当你看到strncpy时,你的头脑中应该发出警告铃声。在这种情况下,你最好只说:

strcpy(IPV6, "0000:0000:0000:0000:0000:0000:");

使用当前代码,IP终结符可能会也可能不会出现在IPV6字符串的末尾。