সংক্ষিপ্ততম কোডটি লিখুন যা কোনও প্রোগ্রামিং ভাষায় একটি সেগমেন্টেশন ফল্ট (SIGSEGV) উত্থাপন করে।
সংক্ষিপ্ততম কোডটি লিখুন যা কোনও প্রোগ্রামিং ভাষায় একটি সেগমেন্টেশন ফল্ট (SIGSEGV) উত্থাপন করে।
উত্তর:
main;
এটি একটি পরিবর্তনীয় ঘোষণা - intপ্রকারটি বিহিত (বি ভাষা থেকে অনুলিপি করা বৈশিষ্ট্য) এবং 0এটি ডিফল্ট মান। যখন মৃত্যুদন্ড কার্যকর করা হয় তখন একটি সংখ্যা চালানোর চেষ্টা করে (সংখ্যাগুলি কার্যকর করা যায় না), এবং কারণগুলি SIGSEGV।
0। staticভেরিয়েবল যেমন শুরু 0, এবং main;হয় static, আমি বাইরে ফাংশন ঘোষিত। c-faq.com/decl/initval.html
mainএকটি অন্তর্নিহিত স্থান, এটি অবস্থিত .bss, সাধারণত ফাংশনগুলি থাকে .textযখন কার্নেলটি এলফ প্রোগ্রামটি লোড করে এটি এর জন্য একটি এক্সিকিউটেবল পৃষ্ঠা তৈরি করে .textএবং অ এর জন্য অপরিবর্তনীয় .bss, সুতরাং মূল কল করে আপনি একটি নির্বাহযোগ্য পৃষ্ঠাতে ঝাঁপ দাও এবং এই জাতীয় পৃষ্ঠায় কোনও কিছু কার্যকর করা একটি সুরক্ষা ত্রুটি।
main __attribute__((section(".text#")))=0xc3;এফটিএফওয়াই (কমপক্ষে এটি আমার x86 উপর ক্র্যাশ না করে ফিরে আসবে বলে মনে হচ্ছে)।
const main=195;,। এটি আকর্ষণীয় যে এটি কাজ করছে, এই কোড গল্ফিং চ্যালেঞ্জের লক্ষ্য ছিল কোডটি সেগফাল্ট করা, কাজ নয় :)।
kill -11 $$
RET
এই কোড segfaults।
exec'()'*7**6
উইন্ডোজ c00000fd এর একটি ত্রুটি কোডের প্রতিবেদন করেছে (স্ট্যাক ওভারফ্লো) যা আমি ধরে নেব সেগমেন্টেশন ত্রুটির একটি সাব টাইপ।
অ্যালেক্স এ এবং মেগোকে ধন্যবাদ, এটি ম্যাক এবং লিনাক্স সিস্টেমে বিভাজন ত্রুটিগুলির কারণও নিশ্চিত হয়েছে। আপনার প্রোগ্রামগুলি পোর্টেবল ক্র্যাশ করার জন্য পাইথন হ'ল পছন্দের ভাষা।
Segmentation fault: 11ম্যাক
Segmentation fault (core dumped)লিনাক্সে
\def~#1{\meaning}\write0{\expandafter~\string}\bye
এটি সম্ভবত সম্ভবত একটি বাগ , তবে এটি নূথের লিখিত মূল টেক্সে উপস্থিত নেই: কোডটি সংকলন করার tex filename.texপরিবর্তে pdftex filename.texসেগফাল্ট তৈরি করে না।
OBTW
অনলাইনে কাজ করে না, কেবল সি ইন্টারপ্রেটারে।
>>> import ctypes;ctypes.string_at(0)
Segmentation fault
সূত্র: http://bugs.python.org/issue1215#msg143236
>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f)
Segmentation fault
সূত্র: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
এটি পাইথন সংস্করণ যা আমি পরীক্ষা করছি:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
সাধারণভাবে পাইথন দোভাষীকে ক্রাশ করা শক্ত, তবে উপরেরটি বেছে বেছে নিন্দনীয় ...
main(){raise(11);}
int func()। অর্থাত্ একটি ফাংশন প্রত্যাবর্তিত int, অনির্দিষ্ট পরামিতি গ্রহণ করে। এই ক্ষেত্রে raiseকোনও ফাংশন হ'ল ইনট্রেটমেন্ট ইনটেনশন গ্রহণ করে ইনট আর্গুমেন্ট গ্রহণ করে, সুতরাং এটি কার্যকর হয় (সংকলক অভিযোগ করলেও)।
/(?{??})/
৫.১৪-তে রেজেক্স ইঞ্জিনটিকে পুনরায় তৈরি করা হয়েছিল যাতে এটি যাতে ক্র্যাশ না হয়ে যায় তবে 5.12 এবং তার আগেরটি সেগফল্ট করে যদি আপনি এটি চেষ্টা করেন।
এটি অদ্ভুত বলে মনে হবে, তবে 32 বিট উইন্ডোজ সিস্টেমগুলিতে, একটি খালি .com ফাইল তৈরি এবং সম্পাদন করা ... কোনও কিছুর উপর নির্ভর করে সেগফল্টের কারণ হতে পারে। ডস কেবল এটি গ্রহণ করে (৮০৮86 এর মেমরি পরিচালনা নেই, দোষের কোনও অর্থপূর্ণ বিভাগ নেই), এবং bit৪ বিট উইন্ডোজ এটিকে চালিয়ে যেতে অস্বীকার করেছে (x86-64 কোনও .com ফাইল চালানোর জন্য v86 মোড নেই)।
<.
হ্যাঁ, এটি বাস্তবায়ন নির্ভর। SIGSEGV সম্ভবত একটি ভাল সংকলক থেকে ফলাফল।
<কোনও প্রভাব নেই বা চারপাশে মোড়ানো উচিত।
foreign import ccall main::IO()
এটি জিএইচসি এবং রান দিয়ে সংকলিত হয়ে গেলে সেগফল্ট তৈরি করে। বিদেশী ফাংশন ইন্টারফেস হ্যাসেল 2010 স্ট্যান্ডার্ডে হওয়ায় কোনও এক্সটেনশন ফ্ল্যাগের প্রয়োজন নেই।
সি সংস্করণটি হ'ল:
*(int*)0=0;
পুরো প্রোগ্রামটি (বেশিরভাগ আইএসও-অনুগত নয়, ধরে নেওয়া যাক এটি কেএন্ডআর সি) 19 টি অক্ষর দীর্ঘ:
main(){*(int*)0=0;}
এসেমব্লার বৈকল্পিক:
orl $0,0
পুরো প্রোগ্রামটি 24 টি চর দীর্ঘ (কেবল মূল্যায়নের জন্য, যেহেতু এটি আসলে একত্রিত নয়):
main(){asm("orl $0,0");}
সম্পাদনা :
সি বৈকল্পিক একটি দম্পতি। প্রথমটি বিশ্বব্যাপী পয়েন্টার ভেরিয়েবলের শূন্য-সূচনা ব্যবহার করে:
*p;main(){*p=0;}
দ্বিতীয়টি অসীম পুনরাবৃত্তি ব্যবহার করে:
main(){main();}
শেষ রূপটি হ'ল সংক্ষিপ্ততম - 7 (15) অক্ষর।
সম্পাদনা 2 :
6 টি (14) অক্ষরগুলির তুলনায় সংক্ষিপ্ততর আরও একটি বৈকল্পিক আবিষ্কার করেছেন। এটি ধরে নিয়েছে যে আক্ষরিক স্ট্রিংগুলি কেবল পঠনযোগ্য বিভাগে রাখা হয়েছে।
main(){*""=0;}
সম্পাদনা 3 :
এবং আমার শেষ চেষ্টা - 1 টি অক্ষর দীর্ঘ:
P
কেবল এটির মতো সংকলন করুন:
cc -o segv -DP="main(){main();}" segv.c
mainএকটি শূন্য- ইনিশিয়েলাইজড গ্লোবাল ইনট ভেরিয়েবল, সুতরাং আমরা যা পাই তা কিছু শূন্য বাইট কার্যকর করার চেষ্টা করার ফলস্বরূপ। X86 এ এটি এমন কিছু হবে add %al,(%rax)যা পুরোপুরি বৈধ নির্দেশ যা সঞ্চিত ঠিকানায় স্মৃতিতে পৌঁছানোর চেষ্টা করে %rax। একটি ভাল ঠিকানা থাকার সম্ভাবনা খুব কম।
[dx0]dx
একটি স্ট্যাক ওভারফ্লো কারণ
[dx0]dx0স্ট্যাকের উপর সঞ্চয় করে, তারপরে dউপরের স্ট্যাক উপাদানটিকে নকল করে, তারপরে xউপরের স্ট্যাক উপাদানটিকে ( dx0) পপ করে এবং এটি কার্যকর করে। যা শীর্ষ স্ট্যাক উপাদানটির সদৃশ করে এবং এটি সম্পাদন শুরু করে ... এটি 0একটি লেজ কল হওয়া রোধ করার জন্য সেখানে থাকা দরকার, তাই তারা সকলেই তৈরি হয়।
কিছুটা প্রতারণামূলক সমাধান হ'ল জো অ্যাডামসের বাশ ট্রিক থেকে একটি চর কাটানো :
kill 11,$$
তবে পার্লে আসল সেগফল্ট unpack pপাওয়া সুস্পষ্ট সমাধান:
unpack p,1x8
প্রযুক্তিগতভাবে, এটি সেগফোল্টের গ্যারান্টিযুক্ত নয় , যেহেতু ঠিকানা 0x31313131 (বা 0x313131313131313131 64৪-বিট সিস্টেমে) কেবল সুযোগের দ্বারা বৈধ ঠিকানার জায়গার দিকে নির্দেশ করতে পারে। তবে প্রতিকূলতা এর বিরুদ্ধে। এছাড়াও, যদি পার্ল কখনও প্ল্যাটফর্মগুলিতে পোর্ট করা থাকে যেখানে পয়েন্টারগুলি b৪ বিটের চেয়ে বেশি হয়, তবে x8ইচ্ছা বাড়াতে হবে।
1x8জিনিস কি?
"11111111".
import os
os.kill(os.getpid(),11)
পাইগনে সিগন্যাল প্রেরণ 11 (SIGSEGV)।
from os import*এবংkill(getpid(),11)
Obj.magic 0 0
এটি ফাংশনটি ব্যবহার করে Obj.magicযা অনিরাপদভাবে দু'ধরনের প্রকারভেদ করে। এই ক্ষেত্রে, এটি 0 (জিসি দ্বারা ব্যবহৃত ট্যাগ বিটের কারণে তাত্ক্ষণিক মান 1 হিসাবে সঞ্চিত) একটি ফাংশন টাইপের (পয়েন্টার হিসাবে সঞ্চিত) কোয়ার্স করে। সুতরাং, এটি ঠিকানা 1 টি dereferences চেষ্টা করে, এবং এটি অবশ্যই segfault হবে।
it coerces 0 (stored as the immediate value 1)- কেন 0 হিসাবে 1 সংরক্ষণ করা হয়?
Obj.magic()0একটি চর খাটো কম :)
Golfed
. $0
পুনরাবৃত্তভাবে নিজের মধ্যে স্ক্রিপ্ট অন্তর্ভুক্ত।
ব্যাখ্যা
পুনরাবৃত্তির "উত্স" (।) অপারেশনটি শেষ পর্যন্ত একটি স্ট্যাকের ওভারফ্লোর কারণ ঘটায় এবং বাশ লিবিসিগেসভিভের সাথে একীভূত না হওয়ার ফলে এটি একটি সিএসএসইজিভিতে আসে ।
মনে রাখবেন, এই একটি বাগ, কিন্তু একটি প্রত্যাশিত আচরণ, যেমন আলোচনা নয় এখানে ।
পরীক্ষা
./bang
Segmentation fault (core dumped)
⌠[]+⌡9!*.
যদি উপরেরটি ক্রাশ না হয় তবে সংখ্যাটি বাড়িয়ে দেওয়ার চেষ্টা করুন (বহু অঙ্কের সংখ্যাগুলি প্রকৃতপক্ষে একটি শীর্ষস্থানীয় কোলন দিয়ে নির্দিষ্ট করা হয়েছে)
গভীরভাবে নেস্টেড বস্তু জড়িত অজগরটিতে একটি বাগ ব্যবহার করে দোভাষীকে ক্র্যাশ করে itertools.chain, যা প্রকৃতপক্ষে +অপারেটর বাস্তবায়নের জন্য ব্যবহার করে ।
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
unsafe{int i=*(int*)0;}
এটির কাজ করার জন্য অবশ্যই নিরাপদ / অনিরাপদ সংকলন করতে হবে। কিছু কারণে আমি বুঝতে পারি না, *(int*)0=0কেবল একটি নালারফেরান এক্সেপশন নিক্ষেপ করে, যখন এই সংস্করণটি যথাযথ অ্যাক্সেস লঙ্ঘন দেয়।
int i=*(int*)0;আয় আমার জন্য একটি NullReferenceException।
*(int*)-1=0এবং একটি অ্যাক্সেস লঙ্ঘন পেতে।
*(int*)0=0ব্যতিক্রম ছুঁড়েছে সম্ভবত অপটিমাইজেশনের কারণে। বিশেষত, চেক করার nullব্যয়টি এড়াতে , অপ্টিমাইজার নাল চেকগুলি সরিয়ে ফেলতে পারে, তবে যখন কোনও সেগফোল্ট ঘটে তখন এটি যথাযথ হিসাবে পুনর্বিবেচনা করতে পারে NullReferenceException।
$ pil
: ('0)
Segmentation fault
এটি উদ্দেশ্যমূলক আচরণ। তাদের ওয়েবসাইটে বর্ণিত হিসাবে:
যদি কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজ "প্রোগ্রামিংয়ের সুইস আর্মি নাইফ" হিসাবে দাবি করে তবে পিকোলিপসকে "স্ক্যাল্পেল অফ প্রোগ্রামিং" বলা যেতে পারে: তীক্ষ্ণ, নির্ভুল, ছোট এবং লাইটওয়েট, তবে অনভিজ্ঞদের হাতেও বিপজ্জনক dangerous
real,pointer::p(:)=>null()
p(1)=0.
end
সংকলন:
gfortran segv.f90 -o segv
এক্সেকিউশন:
./segv
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7FF85FCAE777
#1 0x7FF85FCAED7E
#2 0x7FF85F906D3F
#3 0x40068F in MAIN__ at segv.f90:?
Erreur de segmentation (core dumped)
উপকরণ:
gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
main(a){*(&a-1)=1;}
এটি মূল ফাংশনের রিটার্নের ঠিকানা মানকে দূষিত করে, সুতরাং এটির ফেরতলে একটি সিএসএসইজিভি পায় main।
(এটি আমার কাছে একটি থিম হয়ে উঠছে, সম্ভবত এটি আমি একমাত্র ভাষা কারণ জানি যে এখানে অন্য কেউই করেন না))
inc(r0)
প্রোগ্রাম শুরুর পরে আর -0 [যা সিম ডিবাগার অনুসারে 05162 হবে] এর প্রাথমিক মান দ্বারা সম্বোধিত একক বাইট বৃদ্ধি করে।
0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000
এবং, সর্বদা হিসাবে, শেষে বহির্মুখী বাইটগুলি ফালা দিয়ে মুছে ফেলা যায়।
উত্সটি আরও খাটো করার জন্য আমি কয়েকটি প্রচেষ্টা করেছি, তবে সর্বদা একটি সিনট্যাক্স ত্রুটি বা সিগবাস পেয়ে শেষ হয়েছিল।
আমার এক প্রশ্নের জবাবে আম্রো এই তর্কটি নিয়ে এসেছিলেন:
S = struct();
S = setfield(S, {}, 'g', {}, 0)
clear()
একেবারে সবকিছু সাফ করে, কেবলমাত্র বর্তমান সুযোগ নয় যা স্পষ্টতই প্রচুর পরিমাণে বর্কের কারণ হয়ে দাঁড়ায় যার ফলস্বরূপ জেএস বয়ে যায় এবং সেগফাল্টিং হয়
j1Z
এটিই সেই অংশ যেখানে আমি ব্যাখ্যা করব যে কীভাবে আমি এই উত্তরটি নিয়ে এসেছি, বৈধভাবে আমার কোনও ধারণা নেই । যদি কেউ আমার জন্য এটি ব্যাখ্যা করতে পারে তবে আমি কৃতজ্ঞ হব।
ব্যাখ্যা
jবেসটি স্কোয়ার করে এবং বেসটি কমপক্ষে সংখ্যার চেয়ে বড় না হওয়া পর্যন্ত নিজেকে পুনরাবৃত্তভাবে ডাকে calls বেসটি যেহেতু 0 , তাই কখনই ঘটে না। পর্যাপ্ত উচ্চ পুনরাবৃত্তি সীমা সহ, আপনি একটি সেগফল্ট পাবেন।
jচালু রয়েছে 1এবং 0যা বেসে রূপান্তরিত করার চেষ্টা করে । কেন যে 10