সি ++ প্রোগ্রাম ক্রাশ করার সহজতম উপায় কী?


318

আমি পাইথন প্রোগ্রামটি তৈরি করার চেষ্টা করছি যা একটি ভিন্ন ক্র্যাশ প্রক্রিয়াটির সাথে ইন্টারফেস করে (এটি আমার হাতের বাইরে)। দুর্ভাগ্যক্রমে আমি যে প্রোগ্রামটির সাথে ইন্টারফেস করছি তা নির্ভরযোগ্যভাবে ক্রাশ হয় না! সুতরাং আমি একটি দ্রুত সি ++ প্রোগ্রাম তৈরি করতে চাই যা উদ্দেশ্য অনুযায়ী ক্র্যাশ হয় তবে আমি আসলে এটি করার সর্বোত্তম এবং সংক্ষিপ্ততম উপায়টি জানি না, কেউ কি আমার মধ্যে কী রাখবেন তা জানেন:

int main() {
    crashyCodeGoesHere();
}

আমার সি ++ প্রোগ্রামটি নির্ভরযোগ্যভাবে ক্র্যাশ করতে


4
প্রাইভেলগড নির্দেশাবলী কার্যকর করতে আপনি ইনলাইন সমাবেশটি ব্যবহার করতে পারেন:asm { cli; };
নেট কোপ্পেনহেভার

@ হাইচন্যু আমি মনে করি প্রতিটি প্রশ্নের উত্তরের ব্যবহারের মধ্যে পার্থক্য রয়েছে। (এফওয়াইআই: আমি উভয় প্রশ্নের জন্য কিছুতেই ভোট দিয়েছি না)
এন্ড্রু বারবার

ইতিমধ্যে কেউ প্রস্তাব দিলে ব্যতিক্রম ছোঁড়ার কোনও মন্তব্য ?? plz chk আমার উত্তর নীচে anc মন্তব্য
অভিনব

4
Redis নিম্নলিখিত ব্যবহার *((char*)-1) = 'x';ডিবাগ করার জন্য একটি ক্র্যাশ প্রবৃত্ত কোড আমার আরও পড়তে এখানে উত্তর
শফিক Yaghmour

ক্র্যাশ রিপোর্টিং সিস্টেমের জন্য একটি পরীক্ষার কেস অনুসন্ধান করে আমি এই প্রশ্নটি পেয়েছি। ক্র্যাশ প্রতিবেদক এবং স্ট্যাক ডাম্প প্রেরণের জন্য সাধারণ রানটাইম চলাকালীন আমাকে জোর করে চাপানো দরকার। ধন্যবাদ!
Cory Trese

উত্তর:


264

abort()ফাংশন সম্ভবত আপনার সেরা বাজি। এটি সি স্ট্যান্ডার্ড লাইব্রেরির অংশ, এবং এটি "অস্বাভাবিক প্রোগ্রামের সমাপ্তি ঘটানো" (উদাহরণস্বরূপ, মারাত্মক ত্রুটি বা ক্রাশ) হিসাবে সংজ্ঞায়িত করা হয়েছে।


14
নোট করুন যে এর মাধ্যমে ক্র্যাশ abort()করে কোনও ডিস্ট্রাক্টর বা atexitফাংশন কল করে না , যদিও এটি সম্ভবত এখানে গুরুত্বপূর্ণ নয়।
Xoo

139
@ শিও: যদি এটি ডেস্ট্রাক্টর এবং atexitগুলি কল করে , তবে এটি এখন ক্রাশ হওয়ার মতো হবে না?
ডোনাল ফেলো

যেহেতু abort()সঠিক উত্তর, সুতরাং 'প্রস্থান (-1) হওয়া উচিত? Acceptable গ্রহণযোগ্য?
asir6

9
না, যেহেতু এটি কোনও ক্র্যাশ ঘটায় না, কেবল কিছু করা যায়নি বলে কেবল রিপোর্ট করে।
বোটকোডার

উইন্ডোজ। জিসিসি-5.4.0। প্রস্থান কোড: 3. কোনও ত্রুটি বার্তা বাক্স নেই। কনসোল বার্তা: "এই অ্যাপ্লিকেশনটি রানটাইমটিকে একটি অস্বাভাবিক উপায়ে বন্ধ করার জন্য অনুরোধ করেছে more আরও তথ্যের জন্য দয়া করে অ্যাপ্লিকেশনটির সহায়তা দলের সাথে যোগাযোগ করুন।"
ভাদজিম

113

চেষ্টা করুন:

raise(SIGSEGV);  // simulates a standard crash when access invalid memory
                 // ie anything that can go wrong with pointers.

পাওয়া:

#include <signal.h>

3
এটি কেবল বাস্তবায়ন-সংজ্ঞায়িতের চেয়ে বেশি - সংকেতটি ধরা যেতে পারে signal()। যদিও বেশিরভাগ বুদ্ধিমান অ্যাপ্লিকেশনগুলি তা করে না।
ডাস্কউফ -অ্যাক্টিভ-

12
এটি অ্যাপ্লিকেশনটির মধ্যে একটি সাধারণ সিএসএসইজিভির ঠিক ঠিক একইভাবে ক্র্যাশ হবে (যা বেশিরভাগ অ্যাপ্লিকেশন ক্র্যাশ হয়)। এটি ভালভাবে সংজ্ঞায়িত হয় যে এটি কী করে (ডিফল্টরূপে এটি অ্যাপ্লিকেশন থেকে বেরিয়ে আসে এবং একটি মূল ফাইল উত্পন্ন করে)। হ্যাঁ আপনি একটি হ্যান্ডলার সেট করতে পারেন, তবে আপনার যদি এটি না থাকে তবে আপনি এটি একইভাবে পরীক্ষা করতে চান !!
মার্টিন ইয়র্ক

1
+1 এর জন্য raise()। এটি আপনাকে যুক্তি পরিবর্তন করে এক টন বিভিন্ন ধরণের ব্যতিক্রমের জন্য পরীক্ষা করতে দেয়।

3
প্রিয় সমাধান, তবে এটি প্ল্যাটফর্ম নির্ভর।
নাদিম ফারহাত

@ নাদিমফারহাট: কীভাবে? একটি সিগন্যাল হল সমস্ত প্ল্যাটফর্মের একটি সংকেত।
মার্টিন ইয়র্ক

74

শূন্য দ্বারা ভাগ করা অ্যাপ্লিকেশনটিকে ক্রাশ করবে:

int main()
{
    return 1 / 0;
}

29
আপনার সংকলকটি কত চালাক এটি নির্ভর করে সংকলনের সময় ধরা পড়বে। আমি জানি যে ভিজ্যুয়াল স্টুডিও 2008 এটি সি ++ বা সি # এর জন্য সংকলন করবে না।
আইডানও

2
আমি এটি সংকলন করে চালিত করেছি, আপনি কি আমাকে .exe বালি করতে চান?
রই গাভিরেল

1
২০১০ এর মতো ভিজ্যুয়াল স্টুডিওতে সাম্প্রতিক সংস্করণগুলিতে প্রকাশের কনফিগারেশনে এটি কোনও সমস্যা ছাড়াই চলবে। আমি এটি কিছু অপ্টিমাইজেশন অনুমান।
tedyyu

2
iirc

2
এটি অনির্ধারিত আচরণ এবং ক্রাশের গ্যারান্টিযুক্ত নয়। প্রায়শই সংকলকরা অপরিজ্ঞাত আচরণটি অ্যাক্সেসযোগ্য বলে ধরে নেয়। এটি নির্দেশাবলী mainসহ পুরোপুরি মুছে ফেলা হতে পারে ret। মৃত্যুদন্ড কার্যকর হতে পারে কেবল নিম্নলিখিত ফাংশনে।
usr ডিরেক্টরির

64
*((unsigned int*)0) = 0xDEAD;

54
এটি ক্রাশের গ্যারান্টিযুক্ত নয়।
উইন্ডোজ প্রোগ্রামার

8
@ উইন্ডোস্প্রাগ্রামার: না, এটির নিশ্চয়তা নেই । তবে কোন বুদ্ধিমান ওএস এমন কোনও অ্যাপ্লিকেশন বন্ধ করে না যা ঠিকানায় 0 তে মেমরি অ্যাক্সেস করার চেষ্টা করে?
জোচিম সৌর

29
"তবে কোন বুদ্ধিমান ওএস এমন কোনও অ্যাপ্লিকেশন বন্ধ করে না যা ঠিকানায় 0 তে মেমরি অ্যাক্সেস করার চেষ্টা করে?" - আপনি যা বলতে চান তা আসলে তা নয়, তবে আমি যেভাবেই উত্তর দেব। কিছু কম্পিউটারে অ্যাড্রেস 0 তে র‌্যাম থাকে এবং কোনও প্রোগ্রামের জন্য সেখানে কোনও মান সংরক্ষণ করা একেবারে অর্থপূর্ণ। আরও অর্থবহ প্রশ্নটি হ'ল "কোন ওএস এমন কোনও অ্যাপ্লিকেশনটি থামায় না যা মেসেজ অ্যাক্সেস করে এমন কোনও অ্যাপ্লিকেশন যা সি ++ বাস্তবায়ন নাল পয়েন্টারের জন্য সংরক্ষিত থাকে?" সেক্ষেত্রে আমি কারও কথা জানি না। তবে আসল প্রোগ্রামটি ওএস সম্পর্কে নয়, সি ++ ভাষা সম্পর্কিত।
উইন্ডোজ প্রোগ্রামার

6
এর অপরিবর্তিত আচরণ। এটি কিছুই না করার জন্য এটি পুরোপুরি ঠিক। এমন একটি মেশিন যা ক্রাশ হবে না: জেড 80 সিরিজের প্রসেসর চালিত যে কোনও কিছুই (আমি ধরে নিই (আমার জেড 80a কিছুই করেনা))।
মার্টিন ইয়র্ক

28
যদিও এটি ক্রাশের গ্যারান্টিযুক্ত নয় , এটি সি ++ এর মধ্যে সবচেয়ে সাধারণ ধরণের একটি। সুতরাং আপনি যদি কোনও ক্র্যাশ অনুকরণ করতে চান তবে এটি করার একটি "প্রামাণিক" উপায় :)
ক্রিস বার্ট-ব্রাউন

53

আচ্ছা, আমরা কি স্ট্যাকের ওভারফ্লোতে আছি , না?

for (long long int i = 0; ++i; (&i)[i] = i);

(কোনও মানদণ্ডে ক্র্যাশ হওয়ার গ্যারান্টিযুক্ত নয়, তবে গ্রহণযোগ্য উত্তর সহ প্রস্তাবিত উত্তরগুলির কোনওটিই যেহেতু SIGABRTযেভাবেই ধরা পড়তে পারে। বাস্তবে, এটি সর্বত্র ক্রাশ হবে))


4
আমি দেখতে পাচ্ছি যে অ সুরক্ষিত কোড পৃষ্ঠাগুলি সহ একটি সিস্টেমে মজা করা এবং আপনি এমন কিছু কোড দিয়ে আপনার প্রোগ্রামটিকে ওভাররাইট করে যা দুর্ঘটনাক্রমে একটি অসীম লুপ যা কিছুই করে না। উচ্চমাত্রায় অত্যন্ত চূড়ান্তভাবে অসম্ভব তবে সম্ভাব্য।
মার্টিন ইয়র্ক

@ লোকি: যদি প্রতি 4000 ম বাইট থেকে কেবল এটি পড়ে? ক্রাশ হওয়ার সম্ভাবনা কি কম থাকবে? অবশ্যই কম বিপজ্জনক।
হাঁস মুচিং

70
সেই ক্র্যাশিং অ্যালগরিদম ও (1) নয়!
আন্তন বারকোভস্কি

@ মুভিংডাক: আমি কেবল একটি মজার মন্তব্য করছি। এটিকে গুরুত্ব সহকারে নেবেন না :-) তবে এটি আকর্ষণীয় হবে যদি কেউ মজাদার কিছু করে এমন নির্দেশের অনুক্রম খুঁজে পান।
মার্টিন ইয়র্ক

1
@ লোকিস্টারি: আপনি একদম ঠিক বলেছেন। আমি (&i)[i] += !iপরিবর্তে সম্পর্কে ভাবছিলাম , কিন্তু আমি আশঙ্কা করি যে সংকলকটি যথেষ্ট চালাক হতে পারে এবং এটি অপ্টিমাইজ করতে চাই। :-)
সাম হোচেভার

35
 throw 42;

শুধু উত্তর ... :)


1
উইন্ডোজ। জিসিসি-5.4.0। প্রস্থান কোড: 3. কোনও ত্রুটি বার্তা বাক্স নেই। কনসোল বার্তা: "'int' এর উদাহরণ ছুঁড়ে ফেলার পরে সমাপ্তি আহ্বান করা হয়েছে এই অ্যাপ্লিকেশনটি রানটাইমটিকে অস্বাভাবিক উপায়ে এটি বন্ধ করার জন্য অনুরোধ করেছে more আরও তথ্যের জন্য দয়া করে অ্যাপ্লিকেশনটির সহায়তা দলের সাথে যোগাযোগ করুন।"
ভাদজিম

15

assert(false); বেশ ভাল।

আইএসও / আইইসি 9899: 1999 অনুসারে এনডিইবিউজি সংজ্ঞায়িত না হলে এটি ক্র্যাশ হওয়ার গ্যারান্টিযুক্ত:

যদি NDEBUG সংজ্ঞায়িত করা হয় [...] আসল ম্যাক্রো হিসাবে কেবল সংজ্ঞায়িত করা হয়

#define assert(ignore) ((void)0)

প্রতিস্থাপন ম্যাক্রো প্রতিটি সময় অন্তর্ভুক্ত করা হয় NDEBUG বর্তমান অবস্থা অনুযায়ী পুনরায় সংজ্ঞায়িত করা হয়।

[...]

অ্যাসেট ম্যাক্রো ডায়াগনস্টিক টেস্টগুলিকে প্রোগ্রামগুলিতে রাখে; [...] যদি অভিব্যক্তি (যা একটি স্কেলারের ধরণের হবে) মিথ্যা [...]। এটি পরে গর্ভপাত ফাংশন কল।


আমি অস্পষ্টভাবে ভিসি 2005 স্মরণে ডিবাগ এবং রিলিজের মধ্যে আলাদা আচরণ করে মনে আছে?
টম কের

8
@ টমকে রিলিজ মোডের assertসমতুল্য তৈরি করা ((void)0)হয়েছে।
শেঠ কার্নেগি

2
@ শেঠ কার্নেগি এটির মধ্যে কী ভুল তা দেখতে পাবে না - কেবলমাত্র যদি NDEBUG সংজ্ঞায়িত উইলটি ক্র্যাশ না করা হয়? ড্যানস উত্তরটি বেশ ন্যায্য আইএমএইচও ছিল।
অ্যাড্রিয়ান কর্নিশ

@ অ্যাড্রিয়ানকর্নিশ আমি কেবল টম কেরের প্রশ্নের উত্তর দিচ্ছিলাম, এই উত্তরটি ভুল ছিল না। আমি এই উত্তরটি কমেছি না।
শেঠ কার্নেগি

3
আমি জানি না কেন তিনি এই পরীক্ষামূলক কোডটির "মুক্তি" তৈরি করবেন build
জোয়েল বি

11

যেহেতু ক্র্যাশটি অনির্ধারিত আচরণের উপসর্গ হিসাবে চিহ্নিত হয়েছে এবং যেহেতু অপরিজ্ঞিত আচরণটি চালানো কোনও ক্র্যাশ সহ যাবতীয় কারণ হতে পারে, তাই আমি মনে করি না আপনি সত্যিই আপনার প্রোগ্রামটি ক্র্যাশ করতে চান, তবে কেবল এটি একটি ডিবাগারে ফেলে দেওয়া হয়েছে। এটি করার সবচেয়ে বহনযোগ্য উপায় সম্ভবত isabort()

যদিও raise(SIGABRT)একই প্রভাব রয়েছে, এটা অবশ্যই আরো লিখতে হয়। উভয় উপায় তবে এর জন্য একটি সংকেত হ্যান্ডলার ইনস্টল করে বাধা দেওয়া যেতে পারে SIGABRT। সুতরাং আপনার পরিস্থিতির উপর নির্ভর করে আপনার অন্য সংকেত বাড়াতে / প্রয়োজন হতে পারে। SIGFPE, SIGILL, SIGINT, SIGTERMবা SIGSEGVযেতে উপায় হতে পারে, কিন্তু তারা সব বাধা দিতে পারে।

আপনি যখন অপ্রিয়যোগ্য হতে পারেন, আপনার পছন্দগুলি SIGBUSলিনাক্স ব্যবহারের মতো আরও বিস্তৃত হতে পারে ।


1
আমি সত্যিই সন্দেহ করি যে তিনি জড়িত কোনও ডিবাগার চান। যখন মনে হচ্ছে যে কোনও ক্র্যাশিং প্রোগ্রামের কলকারী যখন তার ক্র্যাশ পাঠিয়েছিল তখন কী ঘটেছিল তা তিনি পরীক্ষা করে দেখতে চেয়েছিলেন। যা খুব যুক্তিসঙ্গত।
ডোনাল ফেলো

9

আমার কাছে কেবল ফ্ল্যাশটি ছিল বাতিল () ফাংশন :

এটি একটি অস্বাভাবিক প্রোগ্রাম সমাপ্তির সাথে প্রক্রিয়াটি বন্ধ করে দেয় t এটি SIGABRT সিগন্যাল উত্পন্ন করে , যা ডিফল্টরূপে প্রোগ্রামটি হোস্ট এনভায়রনমেন্টে একটি ব্যর্থ সমাপ্তির ত্রুটি কোডটি ফিরিয়ে দেওয়া বন্ধ করে দেয় automatic প্রোগ্রামটি স্বয়ংক্রিয় বা স্থিতিশীল স্টোরেজ সময়কালীন অবজেক্টগুলির জন্য ডেস্ট্রাক্টর কার্যকর না করেই শেষ করা হয় program , এবং কোনও অ্যাক্সিট কল না করে (যা প্রোগ্রামটি শেষ হওয়ার আগে প্রস্থান () বলে। এটি কখনও তার কলারে ফিরে আসে না।


9

উত্তরটি প্ল্যাটফর্ম নির্দিষ্ট এবং আপনার লক্ষ্যগুলির উপর নির্ভর করে। তবে এখানে মোজিলা জাভাস্ক্রিপ্ট ক্র্যাশ ফাংশন রয়েছে যা আমি মনে করি এই কাজটি করার জন্য অনেক চ্যালেঞ্জের চিত্র তুলে ধরে:

static JS_NEVER_INLINE void
CrashInJS()
{
    /*
     * We write 123 here so that the machine code for this function is
     * unique. Otherwise the linker, trying to be smart, might use the
     * same code for CrashInJS and for some other function. That
     * messes up the signature in minidumps.
     */

#if defined(WIN32)
    /*
     * We used to call DebugBreak() on Windows, but amazingly, it causes
     * the MSVS 2010 debugger not to be able to recover a call stack.
     */
    *((int *) NULL) = 123;
    exit(3);
#elif defined(__APPLE__)
    /*
     * On Mac OS X, Breakpad ignores signals. Only real Mach exceptions are
     * trapped.
     */
    *((int *) NULL) = 123;  /* To continue from here in GDB: "return" then "continue". */
    raise(SIGABRT);  /* In case above statement gets nixed by the optimizer. */
#else
    raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
#endif
}

2
আপনার এটি পুরোপুরি বাদ দেওয়া উচিত এবং পরিবর্তে jQuery ব্যবহার করা উচিত।
টমাস ওয়েলার 21

1
এটি অনির্ধারিত আচরণ এবং ক্রাশের গ্যারান্টিযুক্ত নয়। প্রায়শই সংকলকরা অপরিজ্ঞাত আচরণটি অ্যাক্সেসযোগ্য বলে ধরে নেয়। সেক্ষেত্রে কমপক্ষে ক্র্যাশিং লাইনটি মুছতে চলেছে এবং অন্যান্য কোডও হতে পারে।
usr ডিরেক্টরির

8

আমি এখানে অনেক পোস্ট পোস্ট পোস্ট দেখেছি যা কাজটি পেতে ভাগ্যবান মামলায় পড়ে যাবে তবে এর মধ্যে কোনওটিই ক্রাশে 100% নিরস্তক নয়। কিছু একটি হার্ডওয়্যার এবং ওএসে ক্র্যাশ করবে, অন্যরা তা করবে না। তবে এটিকে ক্র্যাশ করার জন্য অফিসিয়াল সি ++ স্ট্যান্ডার্ড অনুযায়ী মানক উপায় রয়েছে।

থেকে বরাত দিয়ে সি ++ স্ট্যান্ডার্ড আইএসও / আইইসি 14882 §15.1-7 :

যদি ব্যতিক্রম হ্যান্ডলিং মেকানিজম ব্যতিক্রম অবজেক্টের সূচনা সম্পন্ন করার পরে তবে ব্যতিক্রমটির জন্য হ্যান্ডলারের সক্রিয়করণের আগে, একটি ফাংশন কল করে যা একটি ব্যতিক্রমের মাধ্যমে প্রস্থান হয়, স্ট্যান্ড :: টার্মিনেট বলা হয় (15.5.1))

struct C {
    C() { }
    C(const C&) {
        if (std::uncaught_exceptions()) {
            throw 0; // throw during copy to handler’s exception-declaration object (15.3)
        }
    }
};
int main() {
    try {
    throw C(); // calls std::terminate() if construction of the handler’s
    // exception-declaration object is not elided (12.8)
    } catch(C) { }
}

আমি এটি প্রদর্শনের জন্য একটি ছোট কোড লিখেছি এবং এখানে আইডিয়নে খুঁজে পেতে এবং চেষ্টা করার চেষ্টা করা যেতে পারে ।

class MyClass{
    public:
    ~MyClass() throw(int) { throw 0;}
};

int main() {
  try {
    MyClass myobj; // its destructor will cause an exception

    // This is another exception along with exception due to destructor of myobj and will cause app to terminate
     throw 1;      // It could be some function call which can result in exception.
  }
  catch(...)
  {
    std::cout<<"Exception catched"<<endl;
  }
  return 0;
}

আইএসও / আইইসি 14882 §15.1 / 9 উল্লেখ ছাড়াই নিক্ষেপ উল্লেখ করেছে ফলস্বরূপ কল বাতিল হওয়াতে ফলস্বরূপ:

বর্তমানে যদি কোনও ব্যতিক্রম হ্যান্ডেল না করা হয় তবে কোনও অপারেন্ড কল ছাড়াই একটি থ্রো-এক্সপ্রেশন এক্সিকিউট করা হবে std :: সমাপ্ত ()

অন্যগুলির মধ্যে রয়েছে: ডিস্ট্রাক্টর থেকে নিক্ষেপ: আইএসও / আইইসি 14882 §15.2 / 3


7
*( ( char* ) NULL ) = 0;

এটি বিভাগের ত্রুটি তৈরি করবে।


10
এটি ক্রাশের গ্যারান্টিযুক্ত নয়।
উইন্ডোজ প্রোগ্রামার

23
"পরিবর্তে কি হবে?" - পরিবর্তে কিছু হতে পারে। আচরণটি অপরিজ্ঞাত, সুতরাং বাস্তবায়নটি আপনার প্রোগ্রামের ভেরিয়েবলগুলির মধ্যে 0 থেকে একটি বরাদ্দ করতে পারে, বা এটি আপনার প্রোগ্রামের কোনও একটি ভেরিয়েবলের 42 টি নির্ধারণ করতে পারে বা এটি আপনার হার্ড ড্রাইভকে ফর্ম্যাট করে আপনার প্রোগ্রামটি চালিয়ে যেতে পারে।
উইন্ডোজ প্রোগ্রামার

7
(অবিচ্ছিন্ন "উইন্ডোজ প্রোগ্রামার" মনের সেট) এটি আপনাকে কম্পিউটারকে বিস্ফোরিত করতে পারে বা এটি সরাসরি জীবন্ত আসতে পারে এবং মানবতা দখল করতে পারে। বা ... এটি 99.9% এ ক্র্যাশ হয়ে যাবে এবং এটি "অপরিজ্ঞাত আচরণ" হিসাবে সংজ্ঞায়িত হয়েছে কারণ কেউ এর উপর দায় নিতে চায় না।
রই গাভিরেল

1
আসলে, এটি এমনকি অপরিজ্ঞাত আচরণ করারও গ্যারান্টিযুক্ত নয় - এটি সম্পূর্ণরূপে সংজ্ঞায়িত হতে পারে এবং সঠিকভাবে কাজ করতে পারে। এই কোডটি বিবেচনা করুন: পেস্টবিন. com
ডাব্লুএক্সএক্সটিটিডিডিডি

2
@ cha0site: এটি স্ট্যান্ডার্ড দ্বারা অপরিজ্ঞাত আচরণের নিশ্চয়তা দেয়, কারণ এটি একটি নাল পয়েন্টারকে অবজ্ঞা করছে। লিনাক্সে আপনি যে আচরণটি পর্যবেক্ষণ করেছেন তা "অপরিজ্ঞাত আচরণ" এর ছত্রছায়ায় অনুমোদিত
বেন ভয়েগট

6

এটি অনুপস্থিত:

int main = 42;

1
হ্যাঁ এটা করে; আপনি যখন এটি চালান তবে এটি দর্শনীয় কিছু করে।
জোশুয়া

5

মৃত লুপ পুনরাবৃত্তির পদ্ধতি কল দ্বারা স্ট্যাক ওভারফ্লো সম্পর্কে কী?

#include <windows.h>
#include <stdio.h>

void main()
{
    StackOverflow(0);
}

void StackOverflow(int depth)
{
    char blockdata[10000];
    printf("Overflow: %d\n", depth);
    StackOverflow(depth+1);
}

মাইক্রোসফ্ট কেবি-তে আসল উদাহরণ দেখুন


4
অব্যবহৃত স্ট্যাক বরাদ্দ এবং লেজ কল উভয়ই অপটিমাইজ করা থেকে পর্যাপ্ত স্মার্ট সংকলককে কী আটকাতে পারে?
জেবি।

@JB: unfortunatly কোন ধারণা কারণ সঙ্গে বিদ্যমান কম্পাইলার অপ্টিমাইজেশন যুক্তিবিজ্ঞান familar না
SLL

8
ওয়েল, অপ্টিমাইজেশন স্তর -২২ এবং তারপরে জিসিসি ৪.০.০ দিয়ে এখানে সংকলিত হয়েছে, এটি ঠিক জরিমানা করে। এটি -O1 বা সেগফল্ট থেকে কমের প্রয়োজন।
জেবি।

@Abhinav: শুধু এই উপায়গুলোর সি ++ :) একটি উদাহরণ হিসাবে প্রকাশ সব আপনার উত্তর পোস্ট
SLL

5

এটি আমার লিনাক্স সিস্টেমে ক্র্যাশ হয়ে গেছে, কারণ স্ট্রিং লিটারালগুলি কেবল পঠনযোগ্য মেমরিতে সংরক্ষণ করা হয়:

0[""]--;

যাইহোক, জি ++ এটি সংকলন করতে অস্বীকার করেছেন। সংকলকগুলি আরও স্মার্ট এবং স্মার্ট হয়ে উঠছে :)


4
int i = 1 / 0;

আপনার সংকলক সম্ভবত আপনাকে এ সম্পর্কে সতর্ক করবে, তবে এটি জিসিসি ৪.৪.৩ এর অধীনে ঠিক জরিমানা সংকলন করেছে এটি সম্ভবত একটি সিএইচপিপিই (ভাসমান-পয়েন্ট ব্যতিক্রম) ঘটায়, যা সম্ভবত সিএসএসইজিভি (মেমরি বিভাজন লঙ্ঘন) হিসাবে বাস্তব প্রয়োগে সম্ভবত না অন্যান্য উত্তরগুলি কারণ, কিন্তু এটি এখনও একটি ক্রাশ। আমার মতে এটি অনেক বেশি পঠনযোগ্য।

আর একটি উপায়, যদি আমরা প্রতারণা ও ব্যবহার করতে যাচ্ছি signal.h, তা হ'ল:

#include <signal.h>
int main() {
    raise(SIGKILL);
}

এটি সাবসেসকে হত্যা করার গ্যারান্টিযুক্ত, SIGSEGV এর সাথে বিপরীতে।


2
এটি ক্রাশের গ্যারান্টিযুক্ত নয়।
উইন্ডোজ প্রোগ্রামার

11
সি ++ ভাষা গ্যারান্টি দেয় না যে 1/0 একটি SIGFPE তৈরি করবে। আচরণ অনির্ধারিত। প্রয়োগটি ফলাফলটি 42 হিসাবে বলতে পারে
উইন্ডোজ প্রোগ্রামার

1
আচরণ যখন অপরিবর্তিত থাকে, বাস্তবায়ন যা খুশি তা করতে পারে। সি ++ ভাষা ক্র্যাশ ডাম্প লিখতে বাধা দেয় না এবং প্রয়োগেরও প্রয়োজন হয় না, সি ++ ভাষা ৪২, ইত্যাদি সরবরাহ করতে বাধা দেয় না বা বাস্তবায়নও প্রয়োজন না
উইন্ডোজ প্রোগ্রামার

2
@ জর্জিও যদি হার্ডওয়্যারটির স্বয়ংক্রিয়ভাবে আটকা পড়ার কোনও উপায় না থাকে তবে আপনি কমপায়ারদের কমপক্ষে দুটি নির্দেশ নির্গত করতে বাধ্য করেন, যার মধ্যে একটি শাখাও হবে। এটি একটি বিভাগের ব্যয়কে প্রায় দ্বিগুণ করে। প্রত্যেকে সেই দামটি দেয়। যদি এটি alচ্ছিক হয় এবং আপনি এটি চান তবে আপনি তার জন্য সর্বদা একটি লাইব্রেরি ফাংশন ব্যবহার করতে পারেন। যদি এটি alচ্ছিক না হয় এবং আপনি এটি না চান তবে আপনি এখনও ব্যয়টি শেষ করবেন।
ফ্লেক্সো

2
@ জর্জিও: আমার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যা 10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 جوړېফফফতি আমি এই বাস্তবতার জন্য জানি যে এর মধ্যে 0 টি শূন্য দ্বারা ভাগ হবে যদিও সংকলক এটি জানার কোনও উপায় নেই is আমি স্পষ্টতই চাই না যে সংকলকটি শূন্য দ্বারা একটি বিভাগের জন্য চেক লাগিয়ে দেবে।
মার্টিন ইয়র্ক

4

এটি উপরোক্ত উত্তরে উপস্থাপনের আরও গ্যারান্টিযুক্ত সংস্করণ s সিগাব্র্ট ব্লক করা অবস্থায় এটির পরিস্থিতিটি যত্ন করে। আপনি প্রোগ্রামটি বিধ্বস্ত হওয়ার ডিফল্ট ক্রিয়াকলাপটি বাতিল করার পরিবর্তে যে কোনও সংকেত ব্যবহার করতে পারেন।

#include<stdio.h>
#include<signal.h>
#include<unistd.h> 
#include<stdlib.h>
int main()
{
    sigset_t act;
    sigemptyset(&act);
    sigfillset(&act);
    sigprocmask(SIG_UNBLOCK,&act,NULL);
    abort();
}

3
int* p=0;
*p=0;

এটিও ক্রাশ হওয়া উচিত। উইন্ডোজ এ এটি অ্যাক্সেসভিওলেশন সহ ক্র্যাশ হয়ে গেছে এবং আমার ধারণা সকল ওএস-এসেই এটি করা উচিত।


5
on all OS-esনা, এটা অ সুরক্ষিত OS এ বিপর্যস্ত নয় (যেমন MS-DOS এর।) আসলে, মাঝে মাঝে হয় ঠিকানা 0 কিছু! X86 রিয়েল মোডের জন্য,
ইন্ট্যারাপ্ট

এটি ইরিক্সের উপর ক্র্যাশ হয়নি। আমি দুঃখিতভাবে উপলব্ধি যখন আমরা লিনাক্স (যে কোড বৈশিষ্ট্যসমূহ নিয়ে আসা যেখানে আমরা এমনকি পৌঁছাতে না main()
Scheff

3

এটি ব্রেকপ্যাডে গুগল সরবরাহ করেছে স্নিপেট।

  volatile int* a = reinterpret_cast<volatile int*>(NULL);
  *a = 1;

1
যেহেতু আমি ব্রেকপ্যাড পরীক্ষা করছি ঠিক এটিই আমি চেয়েছিলাম! আমি দেখেছি যে কিছু ব্রেকপ্যাড মিনিডাম্পস স্ট্যাক ট্রেস তৈরি করে না যা আমার কোডের লাইনটিতে ক্র্যাশ ঘটায় causing এইটি করে, তাই আমি এটি ভাল পোক পরীক্ষা হিসাবে ব্যবহার করতে পারি।
বুভিন জে


2

যদিও এই প্রশ্নের ইতিমধ্যে একটি স্বীকৃত উত্তর রয়েছে ...

void main(){
    throw 1;
}

অথবা ... void main(){throw 1;}


2

কেবলমাত্র পঠনযোগ্য মেমরিটিতে লেখার ফলে বিভাগটি ত্রুটি ঘটবে যদি না আপনার সিস্টেম কেবল পঠনযোগ্য মেমরি ব্লককে সমর্থন করে না।

int main() {
    (int&)main = 0;
}

আমি এটি উইন্ডোজ 7-এ মিংজিডাব্লু 5.3.0 এবং লিনাক্স মিন্টে জিসিসি দিয়ে পরীক্ষা করেছি। আমি মনে করি যে অন্যান্য সংকলক এবং সিস্টেমগুলি একই রকম প্রভাব দেবে।


1

বা অন্য কোনও উপায় যেহেতু আমরা ব্যান্ড ওয়াগনে আছি।

অসীম পুনরাবৃত্তির একটি সুন্দর টুকরো। আপনার স্ট্যাক উড়িয়ে দেওয়ার গ্যারান্টিযুক্ত

int main(int argv, char* argc)
{
   return main(argv, argc)
}

প্রিন্ট আউট:

সেগমেন্টেশন ফল্ট (কোর ডাম্প)


13
mainনিজেকে কল করা আসলে অপরিজ্ঞাত আচরণ, যদি আপনি জানেন না যে ক্ষেত্রে :) এছাড়াও, লেজ পুনরাবৃত্তি আপনার স্ট্যাক ফুঁ দিয়ে গ্যারান্টিযুক্ত হয় না । আপনি যদি "গ্যারান্টি" চান তবে পুনরাবৃত্তির কল করার পরে আপনাকে কিছু করতে হবে , অন্যথায় সংকলক অসীম লুপে পুনরাবৃত্তিকে অনুকূল করতে পারে।
ফ্রেডওভারফ্লো

0

একটি যা এখনও উল্লেখ করা হয়নি:

((void(*)())0)();

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


3
আমি বেশ কয়েকটি মেশিন জানি যা এটি ওএস স্টার্টআপ কোডটি কার্যকরভাবে ঠিকানায় ঠিকঠাকভাবে ম্যাপ করা হয়ে থাকে কারণ এটি পুনরায় বুটের কারণ হবে ass মনে করবেন না যে সবকিছু আপনার পিসির মতো কাজ করবে। আপনি বলতে পারেন যে এটি একটি ক্র্যাশ ছিল তবে এটি খুব কার্যকর নয় কারণ আপনি এটিকে ডিবাগ করতে পারবেন না কারণ সমস্ত রাজ্য শুরুতে মুছে ফেলা হয়।
মার্টিন ইয়র্ক

@ লোকি আস্তারি: আমি কেউই কম বলব না যে এটি একটি ক্র্যাশ - যদি এটির কারণ হতে পারে তবে প্রোগ্রামটি ডিবাগ করাও হতে পারে, অর্থাত এটি যে কোনও পরীক্ষার মতোই দুর্দান্ত। অন্যদিকে, আমি উত্সাহী এই মেশিনগুলির মধ্যে কোনটি পাইথন চালাতে পারে run
আন্তন গোলভ

আমি মনে করি তুমি অংশটি অতিক্রম করেছ। আমি ওএস কোডটি 0 এ দেখেছি mean
মার্টিন ইয়র্ক

আমি 0 এ ওএস কোড সম্পর্কে সচেতন; এটি একটি কারণ যা আমি দৃ strongly়ভাবে সন্দেহ করি যে 0 এর বাইটগুলি প্রত্যাবর্তনের জন্য অপকড হবে। প্রোগ্রামটি আরও স্পষ্টভাবে আর চালাচ্ছে না, এবং স্বাভাবিকভাবে প্রস্থান করল না, অর্থাৎ এটি ক্র্যাশ হয়ে গেছে - যদি জিজ্ঞাসাকারীর পক্ষে এটি যথেষ্ট ভাল না হয়, তবে আমি নিজেই সে সম্পর্কে মন্তব্য করার আশা করি।
আন্তন গোলভ

2
আপনি কেবল আপনার মেশিনের জন্য ওএস কোড সম্পর্কে সচেতন। আমি যা বলতে চাইছি তা হ'ল এটি আপনার পক্ষে ব্যর্থ হতে পারে। তবে এর অর্থ কিছুই নয়। সেখানে প্রচুর সিস্টেম রয়েছে। আমি নিশ্চিত যে এগুলির মধ্যে কিছু কাজ করতে পারে (যেমন ক্র্যাশ নয়)। মেশিন / ওএসের নির্দিষ্ট আচরণের উপর নির্ভর করা একটি খারাপ ধারণা এবং দীর্ঘমেয়াদে রক্ষণাবেক্ষণের সমস্যা সৃষ্টি করে। সাইটের ধারণাটি হ'ল ভাল কোড প্রচার করা (কেবলমাত্র সেই ধরণের কাজগুলির কোড নয়)।
মার্টিন ইয়র্ক

0
void main()
{

  int *aNumber = (int*) malloc(sizeof(int));
  int j = 10;
  for(int i = 2; i <= j; ++i)
  {
      aNumber = (int*) realloc(aNumber, sizeof(int) * i);
      j += 10;
  }

}

আশা করি এই ক্রাশ হবে। চিয়ার্স।


0
int main()
{
    int *p=3;
    int s;
    while(1) {
        s=*p;
        p++;
    }
}

2
এটির কিছু স্পষ্টতা থাকলে দুর্দান্ত হবে :)
vly

1
পি পয়েন্টার প্রোগ্রামের ঠিকানার স্থান ছাড়িয়ে যাবে যা একটি মেমরি ত্রুটি হবে, কারণ কোনও প্রক্রিয়া অন্য প্রক্রিয়ার মেমোরি অ্যাক্সেস করতে পারে না। এর ফলে প্রোগ্রামটি ক্রাশ হয়ে যাবে। পয়েন্টার পি তার ঠিকানা স্পেসে একটি এলোমেলো অবস্থানের দিকে ইঙ্গিত করছে, যদি এটি বাড়ানো হয় এবং কোনও পর্যায়ে অসীমভাবে অবলম্বন করা হয় তবে এটি অন্য প্রোগ্রামের (প্রক্রিয়া) ঠিকানা জায়গার দিকে নির্দেশ করবে। সুতরাং এটি কিছু সময়ের পরে ক্রাশ হবে।
sc_cs

বা, অনুমানকৃতভাবে এটি পূর্ণসংখ্যার ওভারফ্লো অর্জন করতে পারে এবং চারপাশে মোড়ানো, অসীমভাবে চলতে পারে। আমি ব্যবহার করতে চেষ্টা করেছি long longবা দ্রুত ক্র্যাশ করার জন্য সংশ্লিষ্ট সর্বাধিক মান থেকে size_tশুরু করে দিয়েছি বা pএটির কাছাকাছি এসেছি । যদিও এটি এখনও সেক্ষেত্রে ক্র্যাশ করার গ্যারান্টিযুক্ত নয়।
প্যাট্রিক রবার্টস

0

এটি করার একটি আড়ম্বরপূর্ণ উপায় হল খাঁটি ভার্চুয়াল ফাংশন কল:

class Base;

void func(Base*);

class Base
{
public:
   virtual void f() = 0;
   Base() 
   {
       func(this);
   }
};

class Derived : Base
{
   virtual void f()
   {
   }
};

void func(Base* p)
{
   p->f();
}


int main()
{
    Derived  d;
}

জিসিসি সহ এই সংকলিত:

খাঁটি ভার্চুয়াল পদ্ধতি বলা হয়

সক্রিয় ব্যতিক্রম ছাড়াই ডাকা সমাপ্তি

বাতিল করা হয়েছে (কোর ফেলে দেওয়া হয়েছে)


0

তুমি তোমার C ++ মণ্ডলীর ব্যবহার করতে পারেন code কিন্তু INT 3 অন্যান্য সিস্টেমের শুধুমাত্র x86- সিস্টেমের জন্য অন্যান্য ফাঁদ / ব্রেকপয়েন্ট নির্দেশাবলী হতে পারে।

int main()
{
    __asm int 3;

    return 0;
}

INT 3 একটি বাধা সৃষ্টি করে এবং ওএস দ্বারা সেটআপ করা একটি বাধা ভেক্টরকে কল করে।


0

জিসিসি বা ঝনঝনিতে __builtin_trap () অথবা এমএসভিসিতে __debugbreak () ব্যবহার করুন। এই ব্রেকপয়েন্টগুলি / ট্র্যাপগুলি পরিচালনা না করা একটি অচলাবস্থায় ব্রেকআপপয়েন্ট ব্যতিক্রম / ক্রাশের দিকে নিয়ে যাবে। অন্য পরামর্শগুলি যা গর্ভপাত () বা প্রস্থান () ব্যবহার করে: এগুলি অন্যান্য থ্রেড দ্বারা পরিচালিত হতে পারে, ক্র্যাশটিকে ছড়িয়ে দেওয়া থ্রেডের স্ট্যাকটি দেখতে আরও কঠিন করে তোলে।


-2
char*freeThis;
free(freeThis);

অবিচ্ছিন্ন পয়েন্টার মুক্ত করা অপরিজ্ঞাত আচরণ। অনেক প্ল্যাটফর্ম / সংকলকগুলিতে freeThisএকটি এলোমেলো মান থাকবে (যা আগে সেই মেমরির অবস্থানটিতে ছিল)। এটি নিখরচায় সিস্টেমটিকে সেই ঠিকানায় মেমরিটি মুক্ত করতে বলা হবে, যা সাধারণত একটি সেগমেন্টেশন ত্রুটি সৃষ্টি করে এবং প্রোগ্রামটি ক্র্যাশ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.