খুব সাধারণ কোড থেকে "অবৈধ হার্ডওয়্যার নির্দেশ"


9

একটি সন্দেহজনক দাবি তদন্ত করার সময় , আমি এই ছোট পরীক্ষা প্রোগ্রামটি লিখেছিলামnoway.c

int proveit()
{
    unsigned int n = 0;
    while (1) n++;
    return 0;
}

int main()
{
    proveit();
    return 0;
}

এটি পরীক্ষা করে, আমি পেয়েছি:

$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction  ./a.out

ওয়াত।

যদি আমি অপটিমাইজেশন ছাড়াই সংকলন করি তবে এটি প্রত্যাশার সাথে ঝুলছে। আমি সমাবেশটি দেখেছি এবং সমস্ত ঘণ্টা এবং শিস ছাড়াই mainফাংশনটি এমন দেখাচ্ছে:

_main:                                  ## @main
    pushq   %rbp
    movq    %rsp, %rbp
    ud2

ud2স্পষ্টতই যেখানে অনির্ধারিত আচরণের জন্য নির্দেশ রয়েছে apparent পূর্বোক্ত সন্দেহজনক দাবি, "এমন ফাংশন যা কখনই ফেরত না হয় ইউবি", তাকে আরও জোর দেওয়া হয়েছে। যদিও এখনও বিশ্বাস করা আমার পক্ষে কঠিন। সত্যিই !? আপনি নিরাপদে কোনও স্পিন লুপ লিখতে পারবেন না?

সুতরাং আমি অনুমান করি আমার প্রশ্নগুলি হ'ল:

  1. এটি কি চলছে তার সঠিক পড়া?
  2. যদি তা হয় তবে কেউ কি আমাকে এমন কোনও অফিসিয়াল রিসোর্সের দিকে নির্দেশ করতে পারে যা এটি যাচাই করে?
  3. এমন পরিস্থিতি কী যেখানে আপনি এই ধরণের অপ্টিমাইজেশনটি ঘটতে চান?

প্রাসঙ্গিক তথ্য

$ clang --version
Apple clang version 11.0.0 (clang-1100.0.20.17)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

3
আইআইআরসি, স্বাক্ষরিত আন্ত ওভারফ্লো হ'ল ইউবি।
ওয়াইল্ডপ্লাজার

1
^^^^ যেমন int n = 0===> unsigned int n = 0;বা আরও উত্তম ..while (1);
WhozCraig

1
হুমম ... সংকলক এক্সপ্লোরার বিড়ম্বনা -O gcc.godbolt.org/z/NTCQYT এবং এটি ছাড়াই একটি লাইন বাই লাইন অনুবাদ সহ একটি স্ব-লক্ষ্যমাত্রা লাফের নির্দেশ পায় । অনেকগুলি সংস্করণ জুড়ে সুসংগত বলে মনে হচ্ছে। কিন্তু আমি এটাও (যদিও এটি খোঁজা হবে না) সি মান বলছেন যে একটি অ-সমাপ্ত UB হয় প্রত্যাহার হলে এর পার্শ্ব প্রতিক্রিয়া বিনামূল্যে । এখানে হ্যান্স বোহেম ব্যাখ্যা করছেন যে এটি কিছু অন্যথায় অসম্ভব-অসম্ভব সংকলক অপ্টিমাইজেশনের অনুমতি দেয়: open-std.org/jtc1/sc22/wg14/www/docs/n1528.htm
জেন

1
অপরিজ্ঞাপিত আচরণ স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো, অসীম লুপ নয়। আপনি এটি ব্যবহার করে এটি ঠিক করতে পারেনunsigned int
এমএম

2
@ জিন আমার মনে হয় না এটি বলছে। অবিচ্ছিন্ন নিয়ন্ত্রণকারী এক্সপ্রেশন সহ পার্শ্ব প্রতিক্রিয়া মুক্ত লুপগুলি সমাপ্তি হিসাবে ধরে নেওয়া যেতে পারে ( পোর্ট 70.net/~nsz/c/c11/n1570.html#6.8.5p6 ) তবে ব্যস্ত লুপিংটি ঠিক হওয়া উচিত। ইউবি পূর্ণসংখ্যার ওভারফ্লোতে রয়েছে, যদিও আমি ইউডি নির্দেশের সাহায্যে উদাহরণটি পুনরুত্পাদন করতে পারি না।
PSkocik

উত্তর:


3

আপনি যদি এখন প্রশ্নে থাকা কোডটির জন্য ud2 পান তবে সংকলকটি কোনও সি সি সংকলক নয়। আপনি একটি সংকলক বাগ রিপোর্ট করতে পারেন।

নোট করুন যে সি ++ এ এই কোডটি আসলে ইউবি হবে। যখন থ্রেডগুলি যুক্ত করা হয়েছিল (যথাক্রমে সি 11 এবং সি ++ 11), সেখানে কোনও থ্রেডের জন্য অগ্রণী অগ্রগতির গ্যারান্টি দেওয়া হয়েছিল, কোনও প্রোগ্রামের মূল সম্পাদনার থ্রেড সহ যা বহু-থ্রেডযুক্ত নয়।

সি ++ এ সমস্ত থ্রেড অবশেষে অগ্রগতি করতে হবে, কোনও ব্যতিক্রম ছাড়াই। তবে সি তে, এমন একটি লুপ যার নিয়ন্ত্রক প্রকাশটি একটি ধ্রুবক অভিব্যক্তি হিসাবে অগ্রগতির প্রয়োজন হয় না। আমার বোধগম্যতা হ'ল সি এটি ব্যতিক্রম যুক্ত করেছে কারণ while(1) {}থ্রেড হ্যাং করতে ব্যবহার করতে এম্বেড কোডিংয়ে এটি ইতিমধ্যে সাধারণ অভ্যাস ছিল ।

আরও বিস্তারিত উত্তর সহ একই প্রশ্ন


হ্যাঁ আমি ud2সি কোডটি থেকে পেয়েছি তবে সি ++ অগ্রগতির গ্যারান্টি সম্পর্কে তথ্য অন্তর্ভুক্ত করার জন্য আপনাকে ধন্যবাদ (একটি শব্দ মনে হয় আমি গবেষণা করতে সক্ষম হবো) যা আমি সত্যিই জিজ্ঞাসা করেছিলাম তবে পেয়েছি, আহ, অপ্টিমাইজড হিসাবে দূরে আমি প্রশ্ন প্রস্তুত ছিল।
লুউকি

স্ট্যান্ডার্ডস কমিটি যা বলার চেষ্টা করছিল তার একটি আরও ভাল বাক্যটি হ'ল যদি কোনও লুপের অতীতের মধ্যে সমস্ত কিছু পিছিয়ে দেওয়া যদি কোনও নির্দিষ্ট ক্রিয়াকলাপ পর্যবেক্ষণের সাথে প্রোগ্রামের আচরণকে প্রভাবিত না করে, পুরো অতীত হিসাবে লুপের কার্যকারণ স্থগিত করে যে অপারেশনটিকে বিবেচনা করা হবে না আচরণের পর্যবেক্ষণযোগ্য পরিবর্তন
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.