আমি পড়েছি বিভিন্ন পোস্ট উপর স্ট্যাক ওভারফ্লো Re: derefercing টাইপ-punned পয়েন্টার ত্রুটি। আমার বোধগম্যতাটি হ'ল ত্রুটিটি মূলত একটি ভিন্ন ধরণের পয়েন্টারের মাধ্যমে কোনও বস্তুর অ্যাক্সেসের বিপদ সম্পর্কে সংকলক সতর্কতা (যদিও এর ব্যতিক্রম ব্যতিক্রম বলে মনে হয় char*
) যা একটি বোধগম্য এবং যুক্তিসঙ্গত সতর্কতা।
আমার প্রশ্নটি নীচের কোডের সাথে সুনির্দিষ্ট: কেন পয়েন্টারের ঠিকানা void**
এই সতর্কতার জন্য যোগ্যতা অর্জন করে (এর মাধ্যমে ত্রুটি হিসাবে প্রচারিত হয় -Werror
)?
তদুপরি, এই কোডটি একাধিক টার্গেট আর্কিটেকচারের জন্য সংকলিত হয়েছে, যার মধ্যে একটি মাত্র সতর্কতা / ত্রুটি উত্পন্ন করে - এটি কি বোঝাতে পারে যে এটি বৈধভাবে সংকলক সংস্করণ-নির্দিষ্ট ঘাটতি?
// main.c
#include <stdlib.h>
typedef struct Foo
{
int i;
} Foo;
void freeFunc( void** obj )
{
if ( obj && * obj )
{
free( *obj );
*obj = NULL;
}
}
int main( int argc, char* argv[] )
{
Foo* f = calloc( 1, sizeof( Foo ) );
freeFunc( (void**)(&f) );
return 0;
}
উপরের বর্ণিত আমার বোধগম্যটি যদি সঠিক হয়, ক void**
, এখনও মাত্র পয়েন্টার হয়ে থাকে তবে এটি নিরাপদ ingালাই হওয়া উচিত।
এই সংকলক-নির্দিষ্ট সতর্কতা / ত্রুটি প্রশমিত করবে এমন লভালিউস ব্যবহার না করে এমন কোনও কাজ রয়েছে কি ? আমি এটি বুঝতে পারি এবং এটি কেন এই সমস্যার সমাধান করবে, তবে আমি এই পদ্ধতিকে এড়াতে চাই কারণ আমি একটি উদ্দেশ্যপ্রাপ্ত আউট-আর্গুলেশন freeFunc()
নুলের সুবিধা নিতে চাই :
void* tmp = f;
freeFunc( &tmp );
f = NULL;
সমস্যা সংকলক (একটির একটি):
user@8d63f499ed92:/build$ /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc --version && /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-fc3-linux-gnu-gcc (GCC) 3.4.5
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
./main.c: In function `main':
./main.c:21: warning: dereferencing type-punned pointer will break strict-aliasing rules
user@8d63f499ed92:/build$
অভিযোগ না করা সংকলক (অনেকের মধ্যে একটি):
user@8d63f499ed92:/build$ /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc --version && /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-rh73-linux-gnu-gcc (GCC) 3.2.3
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
user@8d63f499ed92:/build$
আপডেট: আমি আরও আবিষ্কার করেছি যে সতর্কতাটি নির্দিষ্টভাবে সংঘটিত হওয়ার সময় উত্পন্ন হয়েছে বলে মনে হচ্ছে -O2
(এখনও কেবলমাত্র উল্লেখযোগ্য "সমস্যা সংকলক" সহ)
void**
, এখনও কেবল পয়েন্টার হিসাবে, এটি নিরাপদ ingালাই হওয়া উচিত" " ওহ ওদিকে স্কিপি! আপনার মতো কিছু প্রাথমিক অনুমান চলছে বলে মনে হচ্ছে। বাইটস এবং লিভারের ক্ষেত্রে এবং বিমূর্ততার ক্ষেত্রে আরও কম ভাবার চেষ্টা করুন, কারণ আপনি