Сбой на xcode, но не на окнах. SIGABRT? - PullRequest
1 голос
/ 03 апреля 2011

Я должен написать программу для своего класса программирования 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); 

Спасибо

EDIT

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 ]

6 голосов
/ 03 апреля 2011

Я вижу переполнение буфера:

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

Ваша строка формата выдаст 9 символов, но sprintf будет включать нулевой терминатор. Попробуйте набрать hexIP десять символов.

И обратите внимание на то, что сказал Джои Адамс или memset(IPV6, '\0', 40), прежде чем пытаться что-то в него вставить.

4 голосов
/ 03 апреля 2011

Вы попали в раздражающее предостережение strncpy, а именно: если нулевой терминатор не входит в число первых n байтов строки source , терминатор не будет добавлен в выходной буфер.

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

Это печатает 12345xxxxx вместо 12345.

Когда вы видите strncpy, в вашей голове должны прозвучать предупреждающие колокольчики. В этом случае вам лучше просто сказать:

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

С вашим текущим кодом нулевой терминатор может появляться или не появляться в конце строки IPV6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...