2011-04-03 5 views
1

Мне нужно написать программу для моего класса программирования C, которая преобразует адреса IPV4 в IPV6. Нам была предоставлена ​​функция для преобразования (приведенный ниже код делает фактическое преобразование). У меня возникают проблемы с XCode, когда я запускаю этот код. Я использовал точки останова и выяснил, что он сбой, когда он попадает в линию sprintf(). Сбой: Program received signal: “SIGABRT”. sharedlibrary apply-load-rules all. Я тестировал тот же самый код на компиляторе под Windows, и он работает нормально. Что может привести к тому, что он потерпит неудачу на одном, а не на другом? Моя программа должна запускаться в Windows, а не Mac для процесса оценки, если для этого нет исправления, тогда я сделаю это и напишу остальную часть программы в Windows, но я бы предпочел использовать Mac, чтобы любая помощь была оценена.Ошибка на xcode, но не на окнах. SIGABRT?

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) 
} 
+0

Знаете ли вы, какие компиляторы вы используете? В Xcode вы можете сделать ** Получить информацию ** в своем проекте и проверить настройки сборки. Какой компилятор вы используете в Windows? – BoltClock

+1

Не могли бы вы разместить объявления переменных? Кажется, вы вызываете неопределенное поведение, которое работает в Windows по совпадению. –

+0

На Mac это GCC4.2 (я думаю) и окна в подумайте, что это mingw (я использую quincy так, что бы он ни использовал) – Darc

ответ

5

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

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

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

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

4

Вы упали птицу раздражающего предостережения strncpy «s, а именно, что если нуль-терминатор не входит в числе первых п байт источника струны , терминатор не будет добавлен в выходной буфер.

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

Печатается 12345xxxxx, а не 12345.

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

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

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

Смежные вопросы