हमारी टीम वर्तमान में जीसीसी 4.5.1 के एक अनुकूलित संस्करण का उपयोग कर एआरएम कॉर्टेक्स एम 3 मंच पर आधारित एक पुराने उत्पाद से पुराने पोर्ट्रक्चर से कुछ पोर्ट कोड का उपयोग कर रही है। हम एक संचार लिंक से डेटा पढ़ रहे हैं, और कच्चे बाइट सरणी को डेटा को स्पष्ट रूप से पार्स करने के लिए एक स्ट्रक्चर में डालने का प्रयास कर रहे हैं। एक संरचना और dereferencing के लिए सूचक कास्टिंग करने के बाद, हमें एक चेतावनी मिल रही है: "dereferencing प्रकार-दंडित सूचक सख्त-एलियासिंग नियम तोड़ देगा"।एम्बेडेड सिस्टम में टाइप-पनिंग को सुरक्षित रूप से कैसे करें
कुछ शोध के बाद, मुझे एहसास हुआ है कि चूंकि चार सरणी में कोई संरेखण नियम नहीं है और संरचना को गठबंधन शब्द होना है, पॉइंटर्स को कास्टिंग अपरिभाषित व्यवहार (एक बुरी बात) का कारण बनता है। मैं सोच रहा हूं कि क्या करने की कोशिश करने का एक बेहतर तरीका है।
मैं जानता हूँ कि हम स्पष्ट रूप से जीसीसी का उपयोग शब्द-संरेखित कर सकते हैं चार सरणी "विशेषता ((गठबंधन (4)))"। मेरा मानना है कि यह हमारा कोड "सुरक्षित" बना देगा, लेकिन चेतावनियां अभी भी हमारे निर्माण को अव्यवस्थित कर देगी, और यदि स्थिति फिर से उत्पन्न होती है तो मैं चेतावनियों को अक्षम नहीं करना चाहता हूं। हम जो चाहते हैं वह सुरक्षित रूप से करने का एक तरीका है जिसे हम कोशिश कर रहे हैं, जो हमें तब भी सूचित करेगा यदि हम बाद में किसी अन्य जगह में असुरक्षित कुछ करने का प्रयास करते हैं। चूंकि यह एक एम्बेडेड सिस्टम है, इसलिए कुछ डिग्री के लिए रैम उपयोग और फ्लैश उपयोग महत्वपूर्ण हैं।
पोर्टेबिलिटी (कंपाइलर और आर्किटेक्चर) एक बड़ी चिंता नहीं है, यह केवल एक उत्पाद के लिए है। हालांकि, अगर एक पोर्टेबल समाधान मौजूद है, तो इसे प्राथमिकता दी जाएगी।
#define MESSAGE_TYPE_A 0
#define MESSAGE_TYPE_B 1
typedef struct MessageA __attribute__((__packed__))
{
unsigned char messageType;
unsigned short data1;
unsigned int data2;
}
typedef struct MessageB __attribute__((__packed__))
{
unsigned char messageType;
unsigned char data3;
unsigned char data4;
}
// This gets filled by the comm system, assume from a UART interrupt or similar
unsigned char data[100];
// Assume this gets called once we receive a full message
void ProcessMessage()
{
MessageA* messageA;
unsigned char messageType = data[0];
if (messageType == MESSAGE_TYPE_A)
{
// Cast data to struct and attempt to read
messageA = (MessageA*)data; // Not safe since data may not be word aligned
// This may cause undefined behavior
if (messageA->data1 == 4) // warning would be here, when we use the data at the pointer
{
// Perform some action...
}
}
// ...
// process different types of messages
}
एक टिप्पणी के रूप में, चेतावनी केवल असाइन किए गए पहुंच के बारे में नहीं है, और यह एक वास्तविक समस्या की चेतावनी है। समस्या यह है कि जीसीसी कुछ अनुकूलन करता है जो मानते हैं कि विभिन्न प्रकार के डेटा एक-दूसरे को उपनाम नहीं कर सकते हैं, और यह उस धारणा के आधार पर एक्सेस या अन्य चीजों को पुन: व्यवस्थित कर सकता है - संभावित रूप से गलत परिणाम होने पर गलत परिणाम सामने आते हैं। –