2012-04-14 18 views
5

मुझे यह एक बहु थ्रेडेड सी अनुप्रयोग में मिला। लेखकों ने टिप्पणी की कि इसका उपयोग एक कस्टम जोर समारोह में थ्रेड क्रैश करने के लिए किया जाता है। जीसीसी इसके साथ ठीक है, लेकिन बजना निम्न चेतावनी जारी करता है:* (int *) NULL = 1 के साथ धागे क्रैशिंग; समस्याग्रस्त?

note: consider using __builtin_trap() or qualifying pointer with 'volatile' 

और यह भी उन में से एक के मुद्दों ज़ोर समारोह के प्रत्येक उपयोग के लिए,:

warning: indirection of non-volatile null pointer will be deleted, not trap 

यहाँ क्या चल रहा है? __builtin_trap clang के लिए विशिष्ट है? क्या मुझे इसका इस्तेमाल करना चाहिए?

+3

ध्यान दें कि थ्रेड क्रैश करने जैसी कोई चीज़ नहीं है; किसी भी क्रैश पूरे कार्यक्रम को दुर्घटनाग्रस्त कर देता है ... –

उत्तर

10

NULL के लेखन का पता, मज़बूती से अपने कार्यक्रम के क्रैश होने की गारंटी नहीं है कि के लिए बहुत GCC introduced __builtin_trap

ऐसा लगता है कि क्लैंग ने आगे जाने का फैसला किया है, और इस तरह के लिखने को पूरी तरह से खत्म कर दिया है, लगभग __builtin_trap का उपयोग करने के लिए आपको मजबूर कर रहा है। NULL को volatile पॉइंटर कास्टिंग करने का उनका अन्य विकल्प __builtin_trap की तुलना में आकर्षक नहीं दिखता है, क्योंकि यह "केवल" एक अपरिभाषित व्यवहार है।

+0

यह कहा गया है कि, यदि आप जीसीसी एक्सटेंशन के समर्थन के बिना अन्य कंपाइलर्स द्वारा संकलित कोड को छू रहे हैं तो बस 'अस्थिर' जोड़ना सबसे आसान तरीका हो सकता है। – Yirkha

2

कथन साबित अपरिभाषित व्यवहार। विशेष रूप से संकलक 0 पते पर कुछ स्टोर करने का प्रयास करने के लिए बाध्य नहीं है और इसे अनुकूलित कर सकता है। यह संकलक आपको बता रहे हैं।

exit() या abort() या पूरे प्रक्रिया निष्पादन को समाप्त करने के लिए कुछ डेरिवेटिव का उपयोग करें। यह पोर्टेबल है। (सी 11 exit, _Exit, quick_exit और abort है)