LINUX.ORG.RU

[C] Объясните ньюанс с printf

 


0

0

В сети на некоторых машинах работает анализатор пакетов
{
.....
struct iphdr *ip;
.............
printf("Ip destanation: %s\n",inet_ntoa(ip->daddr)); //segfault in ubuntu
.......
}
Теоритически оно и не должно правильно работать, но в дебе, федоре, сие работает без проблем. А в убунту 9.10 здесь программа сразу улетает. Кто нибудь объяснит почему?!

>I suspect that inet_ntoa is returning you a pointer to a static internal buffer, though the man page doesn't appear to detail this behavior. That means that each call will return the same pointer, and each call will overwrite the buffer contents. Such functions are highly dangerous in multithreaded environments, and should generally be avoided like the plague.

:-)

hizel ★★★★★
()

А рабочий код сложно выложить? Совершенно необязательно, что дело в inet_ntoa. Например, проблема быть может в плохо инициализированном указателе ip.

balodja ★★★
()
Ответ на: комментарий от Boy_from_Jungle

> Нет, дело именно в этом.

Если в этом месте падает, то необязательно, что ошибка именно здесь. Залет по памяти мог случиться раньше.

SilentBob
()
Ответ на: комментарий от Boy_from_Jungle

>спб.
wtf?
>откуда это взято?!

google> printf inet_ntoa

hizel ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Нет, дело именно в этом.

Если у тебя inet_ntoa не вызывается одновременно из нескольких потоков, то проблема _НЕ_ в этом.

anonymous
()
Ответ на: комментарий от LamerOk

Вряд ли автор имел ввиду обнуление указателя на iphdr, скорее имелось ввиду обнуление самой структуры, иначе нет смысла bzero использовать.

balodja ★★★
()
Ответ на: комментарий от balodja

Ну иметь то в виду он мог все, что угодно. Компиляторам, как известно, покласть на то, что имеется в виду. ))

LamerOk ★★★★★
()
Ответ на: комментарий от balodja

Выкладывай всю логическую цепочку, по которой ты дошёл до жизни такой. )))

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.