2011-11-06 19 views
7

मैं आज एक बहुत ही अजीब समस्या में भाग गया। लंबी कहानी छोटी, मेरा फ़ंक्शन एक मान देता है, कॉलर को एक अलग मूल्य मिलता है।सी फ़ंक्शन चेंज वैल्यू। दूषित ढेर?

Message* m = NULL; 
m = connection_receive(c); 

कहाँ connection_receive के रूप में परिभाषित किया गया है इस प्रकार है::

Message* connection_receive(Connection* c) 
{ 
Message* k; 

    if (c->state == CON_STATE_AUTHENTICATED) 
    { 
     pthread_mutex_lock(&c->mutex_in); 

     if (g_queue_is_empty(c->in)) 
      k = NULL; 
     else 
      k = (Message*)g_queue_pop_head(c->in); 

     pthread_mutex_unlock(&c->mutex_in); 
     /* Until here, k is reachable and contains the correct data. */ 
     return k; 
    } 
    else 
     return NULL; 
} 

यहाँ एक gdb रन है, मैं सही वापसी से पहले और सही काम करने के बाद बंद कर दिया:

कहीं मेरे कोड के आसपास मैं को कॉल किया
222   return k; 
(gdb) p k 
$1 = (Message *) 0x7ffff0000950 
(gdb) n 
226 } 
(gdb) n 
main() at src/main.c:57 
57    if (m) 
(gdb) p m 
$2 = (Message *) 0xfffffffff0000950 

बेशक, अगर हम 0xfffffffff0000950 तक पहुंचने का प्रयास करते हैं तो हमें एक सेगमेंटेशन गलती मिल जाएगी।

यदि मैं फ़ंक्शन को बदलता हूं और मूल्य लौटने के बजाय दूसरे मान का उपयोग करके एक मान वापस करने के बजाय, लेकिन मैं जानना चाहता हूं कि इस पर क्या गलत हुआ।

बहुत बहुत धन्यवाद।

संपादित करें: यह काम करता है, लेकिन यह सुविधाजनक नहीं है। और मैं यह भी जानना चाहूंगा कि ऐसी अजीब त्रुटि क्यों हो रही है।

void connection_receive2(Connection* c, Message** m) 
{ 
    if (c->state == CON_STATE_AUTHENTICATED) 
    { 
     pthread_mutex_lock(&c->mutex_in); 

     if (g_queue_is_empty(c->in)) 
      *m = NULL; 
     else 
      *m = (Message*)g_queue_pop_head(c->in); 

     pthread_mutex_unlock(&c->mutex_in); 
    } 
    else 
     *m = NULL; 
} 

EDIT2: हल। सबको शुक्रीया। समस्या हेडर फ़ाइल पर एक टाइपो थी। मैं इसका उपयोग नहीं कर सकता - आतंक क्योंकि मुझे ऐसी चीजें करने की ज़रूरत है जो कुछ चेतावनियां उठाएं, और बड़े पैमाने पर आउटपुट और बड़े हेडर में मैंने इसे याद किया।

+0

मैंने यह एक बार किया था। 'फिन' ने एक रिटर्न वैल्यू दिखाया और वैरिएबल जिसे इसे दूसरे में दिखाया गया था। एक पुनर्मूल्यांकन ने इसे मेरे लिए तय किया (स्रोत को भी नहीं बदला); सबसे अच्छा मैं अनुमान लगा सकता हूं कि एक आश्रित ऑब्जेक्ट फ़ाइल को पुनः प्राप्त नहीं किया गया है, अन्यथा संभवतः जीसीसी में शायद ही कभी (शायद ही कभी सामना किया गया) बग। – Kevin

+0

आपको इसे एक [एसएससीसीई] (http://sscce.org/) पर उबालने की ज़रूरत है जो समस्या का प्रदर्शन करती है और इसे पोस्ट करती है - आपके द्वारा पोस्ट किए गए कोड में कुछ भी गलत नहीं है; समस्या कहीं और है। –

+0

@ ब्रायनरोच, मैं देखता हूं कि मैं क्या कर सकता हूं। यह एक बड़ी परियोजना है। – Victor

उत्तर

5
  1. आपके m को परिभाषित किया गया है?
  2. क्या आपका कॉलर सही प्रोटोटाइप तक पहुंच गया है?
  3. आप किस वास्तुकला पर हैं?

मुझे संदेह है कि प्रकारों के साथ कोई मेल नहीं है और मेरा प्रश्न 2 सभी का क्रूक्स है।

आप 48 या 64 बिट्स के साथ एक पॉइंटर लौट रहे हैं (मुझे लगता है)। कॉलर, हालांकि, int प्राप्त करने के लिए सोचता है, जिसमें 32 बिट्स हैं और हस्ताक्षरित हैं। एक सूचक को वापस बदलने पर, मूल्य साइन-विस्तारित हो जाता है।

+4

+1, मुझे पूरा यकीन है (2) सही है। यही कारण है कि आपको हमेशा अधिकतम संकलन चेतावनी सेट ('-Wall -Werror' gcc पर) के साथ विकसित करना चाहिए, क्योंकि यह इस तरह की चीज़ को पकड़ लेगा। –

+0

हां, रिटर्न वैल्यू का निचला आधा बिल्कुल वही है जो बहुत संदिग्ध है। –

+0

@therefromhere \t मुझे खेद है, मैं कहना भूल गया। मेरा "एम" भी एक संदेश * है। हां, कॉलर के पास एक ही प्रोटोटाइप तक पहुंच है, मैं वास्तव में मॉड्यूल का परीक्षण कर रहा हूं। न तो -वॉल और न ही आगे मुझे कुछ भी दे, यह एक आकर्षण की तरह संकलन कर रहा है। मैं इसे फेडोरा 15, 2.6.40.6-0 64 बिट्स – Victor

0

क्या आपने कतार पर एक मॉलोक: ed ऑब्जेक्ट दबाया था? यदि नहीं और आपने बदले में स्टैक ऑब्जेक्ट को धक्का दिया तो जब आप आइटम पॉप करते हैं तो आप अजीब व्यवहार के साथ समाप्त हो सकते हैं।

+0

यह एक मॉलोक ऑब्जेक्ट है। मैंने मूल पोस्ट संपादित किया, और एक समान परिभाषा पोस्ट की जो ठीक काम करता है। यह वास्तव में अजीब है! – Victor

0

हमें एक ही समस्या का सामना करना पड़ा और मूल कारण फ़ंक्शन कनेक्शन_receive() की निहित घोषणा थी। इसलिए इसे int में डिफॉल्ट किया गया था जिस पर हस्ताक्षर किए गए और फिर एम में संग्रहीत किया गया।

संबंधित मुद्दे