অকার্যকর * পি = && abc এ && এর অর্থ কী;


102

আমি কোডের একটি অংশ জুড়ে এসেছি void *p = &&abc;। এখানকার তাৎপর্য কী &&? আমি মূল্যের রেফারেন্সগুলি সম্পর্কে জানি তবে আমি মনে করি &&এই প্রসঙ্গে ব্যবহৃত অন্যরকম। কি &&নির্দেশ করে void *p = &&abc;?


14
কোথায় আপনি এই দেখেছিলেন?
user541686

3
আপনি এটি কোথায় দেখেছেন তাও জানতে চাই।
ফ্ল্যাভিয়াস

উত্তর:


154

&&বর্তমান ফাংশনে সংজ্ঞায়িত লেবেলের ঠিকানা পাওয়ার জন্য জিসিসির এক্সটেনশন

void *p = &&abc স্ট্যান্ডার্ড সি 99 এবং সি ++ এ অবৈধ।

এটি g ++ দিয়ে সংকলন করে।


42
এখন ভেবে দেখুন জিসিসি যদি ডিফল্টরূপে -পেনডেন্টিক হয় তবে সবাই কতটা ভাল প্রোগ্রামার হবেন। তারপরে লোকেরা জিনাস সম্পর্কে অপ্রাসঙ্গিক তথ্যের পরিবর্তে সি শিখত।
লন্ডিন

4
কি হ্যাক। যদি তারা লেবেল পয়েন্টারগুলির জন্য একটি নতুন সিনট্যাক্স আবিষ্কার করে তবে তাদের ব্যবহারের পরিবর্তে এটির জন্য একটি নতুন ধরণের উদ্ভাবন করা উচিত void*
মার্ক রান্সম

1
@ প্রসূন সৌরভ: যে কেউ হ্রাস পেয়েছে তিনি সম্ভবত বৈশিষ্ট্যটি অস্বীকার করবেন এবং এটি আপনার সামনে নিয়ে আসছেন।
চক

@ লন্ডিন: বেশিরভাগ সংকলক সম্পর্কেও একই কথা বলা যেতে পারে। __forceinline? __declspec(naked)? আমার প্রিয় এমএসভিসিজমগুলির মধ্যে একটি হ'ল:, template<typename T> class X { friend T; }যা সি ++ 03 অবৈধ।
সেবাস্তিয়ান মাচ

দ্বিতীয় লিঙ্কটি মারা গেছে।
সিউর

96

কীভাবে এটি সন্ধান করবেন

এটি কোনও লেবেলের ঠিকানা এবং এটি জিসিসির নির্দিষ্ট বৈশিষ্ট্য ।

int main(void) {
    void* startp;
s:
    startp = &&s;
    printf("the assignment above starts at address %p\n", startp);
    return 0;
}

আপনি এটি পরীক্ষা করে নিজেই বের করতে পারতেন:

int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf("startp=%p\n", startp);
    return 0;
}

যে ক্ষেত্রে জিসিসি বলেছেন:

ত্রুটি: লেবেল 'এ' ব্যবহৃত তবে সংজ্ঞায়িত হয়নি

ফণা অধীনে - সমাবেশ

এটি সত্যই বুঝতে আপনার এসেম্বেবলারকে জানতে হবে, তবে আমি আপনাকে একটি লেবেলের ঠিকানার অর্থ কী তা বোঝানোর চেষ্টা করব।

ওএস ডিস্ক থেকে .exe ফাইলটি লোড করার পরে, "লোডার" নামে অপারেটিং সিস্টেমের একটি উপাদান (উইন্ডোতে "পিই লোডার" থাকে, লিনাক্সটিতে "ইএলএফ লোডার" থাকে বা এমনকি অন্যরাও থাকে, যদি তারা সংকলিত থাকে তবে কার্নেল), এটি সেই প্রোগ্রামটির একটি "ভার্চুয়ালাইজেশন" করে, এটি একটি প্রক্রিয়াতে রূপান্তরিত করে।

এই প্রক্রিয়াটি মনে করে যে এটি র‌্যামের মধ্যে একমাত্র এবং এতে সম্পূর্ণ র‌্যামের অ্যাক্সেস রয়েছে (এটি একটি 32-বিট মেশিনে 0x00000000-0xFFFFFFFF)।

(উপরেরটি কী ঘটছে তার একটি সংক্ষিপ্ত ওভারভিউ, এটি পুরোপুরি বুঝতে আপনাকে সত্যই সমাবেশ শিখতে হবে, সুতরাং আমার সাথে সহ্য করুন)

এখন, উত্স কোডের লেবেলটি মূলত একটি ঠিকানা। "গেটো লেবেল;" এই ঠিকানায় লাফানো ছাড়া আর কিছুই করেন না ( সমাবেশে নির্দেশিকা নির্দেশকের কথা ভাবেন )। এই লেবেলটি এই র‍্যামের ঠিকানা সঞ্চয় করে এবং আপনি সেই ঠিকানাটি কীভাবে খুঁজে পেতে পারেন।

আপনি ASM শিখার পরে, আপনি বুঝতে পারবেন যে ঠিকানাটি .textএক্সিকিউটেবলের বিভাগের মধ্যে থাকা কোনও নির্দেশকে নির্দেশ করে। .textঅধ্যায় এক যা নিষ্পন্ন করা হবে আপনি প্রোগ্রামের (বাইনারি) কোড ঝুলিতে নেই।

আপনি এটি দিয়ে এটি পরিদর্শন করতে পারেন:

objdump -x a.out

একটি ব্যবহারিক উদাহরণ

বর্ণনা অনুযায়ী জিসিসি , আপনি একটি লাফ টেবিল আরম্ভ করতে ব্যবহার করতে পারেন। কিছু স্ক্যানার জেনারেটর যেমন রি 2 সি ( -gপ্যারামিটার দেখুন) আরও কমপ্যাক্ট স্ক্যানার তৈরি করতে এটি ব্যবহার করে। সম্ভবত এখানে একই প্রযুক্তি ব্যবহার করে কোনও পার্সার জেনারেটর রয়েছে


4
-Std = c99- আধুনিক সহ সংকলন করুন।
লন্ডিন

2
খুব উল্লেখ করা গুরুত্বপূর্ণ যে এটি একটি জিসিসি এক্সটেনশান, এবং তেহ ভাষার মূল অংশ নয়
জাল্ফ

1
বেশ চিত্তাকর্ষক ফ্ল্যাভিয়াস।
অষ্টাভিয়ান এ ডামিয়েন

1
আমি এই ধরণের উত্তর পছন্দ করি, আরও কিছু লোককে কেবল বলা না হয়ে উত্তর কীভাবে সন্ধান করা যায় তা শেখানো দরকার।
লেটসিয়াটলঞ্চ

1
গভীরতার ব্যাখ্যার জন্য ধন্যবাদ। সমাবেশ সম্পর্কিত বিশ্লেষণের প্রশংসা করেছেন।
CᴴᴀZ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.