2012-09-12 35 views
1

我有一個非常奇怪的問題,我正在努力。 我有solaris 8/sparc平臺上的舊編譯器(gcc 2.95或更早版本)編譯的代碼。它在solaris 8/sparc上運行良好,但是在solaris 10/sparc上崩潰。 (solaris 10被認爲向後兼容solaris 8)Solaris 8-10:host2ip轉換問題

在調試時,我發現應用程序試圖將主機名轉換爲相應的I/P地址時出現問題。它使用gethostbyname_r,然後使用inet_ntoa來獲取ipv4四元數點。 gdb通過解決方案帶我到我看到由gethostbyname_r返回的in_addr具有表示i/p地址的正確整數,但inet_ntoa調用返回格式錯誤的字符串。在確認其確實是INET_NTOA失敗的一個困難是,代碼是這樣寫下面

strcpy(hostaddr, inet_ntoa(*((struct in_addr *) hostdata.h_addr))); 

因此從技術上講,我不能看到INET_NTOA返回的值。但我可以在GDB做

print (char*)inet_ntoa(*((struct in_addr *) hostdata.h_addr_list[0])) 

看到(這是足夠我相信關閉),並打印出畸形的I/P地址。例如,「0.0」。 (主機名有一個有效的I/P地址,可以從該機器解析出來,因此以0.0開頭的I/P也不是正確的值)

您可以看到,使用帶有inet_ntoa的不安全strcpy會創建一個位未知,並導致分段錯誤。

聽到有人經歷過類似的事情,至於inet_ntoa失敗的原因是什麼,這將是一件好事。系統在某種程度上扮演着一個角色,我不能指出它甚至不知道如何解決這個問題。

所有的意見將不勝感激。

約束條件:我無法修改代碼來使其工作(否則這是微不足道的解決方案)。因此,儘管知道strcpy是一個非常不安全的函數,但是inet_ntoa已經被棄用了,我在這方面很無奈。

編輯: 我有一種感覺,這是一個並行處理問題。我不確定,但我不認爲該應用程序是多線程的。但新的sol10機器是64核心機器。思想鏈的原因是,inet_ntoa唯一真正的問題是靜態緩衝區,並且代碼確實在循環中調用此調用。

+0

你寫了「我有solaris 10/sparc平臺上的舊編譯器(gcc 2.95或更早版本)編譯的代碼。」,我想你的意思是:「... on solaris 8/sparc平臺」。否則,您的代碼將無法在Solaris 8上運行。 – jlliagre

+0

謝謝並更正:) – IDK

回答

0

我發現鏈接器(和錯誤的代碼當然)是問題。 一些超級漂亮的人,儘管通過與標準庫函數(inet_ntoa_r)完全相同的名稱來創建函數是個好主意。當我試圖在將代碼與庫鏈接時使用-static選項時,它開始抱怨用戶庫文件中存在此符號。一旦我擺脫了用戶庫中的那個函數,它就從那次崩潰中移到了另一個問題上(我試圖修復它,期待另一個問題:))。 希望有人發現這個有用的