ল্যাম্বডাস (অপ্রয়োজনীয়) ব্যবহার করুন
পরিবর্তে
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
বা (কেবলমাত্র জিসিসি)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
বা (ব্লক সমর্থন সহ এলএলভিএম)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
কিছু চেষ্টা করুন
qsort(a,b,4,"\x8b\7+\6\xc3");
... যেখানে উদ্ধৃত স্ট্রিংটিতে আপনার "ল্যাম্বদা" ফাংশন (সমস্ত প্ল্যাটফর্ম এবিআইয়ের প্রয়োজনীয়তা অনুসারে) এর মেশিন ভাষার নির্দেশাবলী রয়েছে।
এটি এমন পরিবেশে কাজ করে যেখানে স্ট্রিং ধ্রুবককে সম্পাদনযোগ্য হিসাবে চিহ্নিত করা হয়। ডিফল্টরূপে এটি লিনাক্স এবং ওএসএক্সে সত্য তবে উইন্ডোজ নয়।
আপনার নিজের "ল্যাম্বদা" ফাংশনগুলি লিখতে শেখার একটি নিখুঁত উপায় হ'ল সিটিতে ফাংশনটি লিখুন, এটি সংকলন করুন, এর মতো কিছু দিয়ে এটি পরীক্ষা করুন objdump -D
এবং সংশ্লিষ্ট হেক্স কোডটি স্ট্রিংয়ে অনুলিপি করুন। উদাহরণ স্বরূপ,
int f(int*a, int*b){return *a-*b;}
... যখন gcc -Os -c
একটি লিনাক্স x86_64 টার্গেট দিয়ে সংকলন করা হয় এরকম কিছু তৈরি করে
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
জিএনইউ সিসি goto
:
আপনি এই "ল্যাম্বডা ফাংশনগুলি" সরাসরি কল করতে পারেন তবে আপনি যে কোডটি কল করছেন তাতে যদি প্যারামিটার লাগে না এবং ফিরে না আসে তবে আপনি goto
কয়েকটি বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন । পরিবর্তে তাই
((int(*)())L"ﻫ")();
বা (যদি আপনার পরিবেশে আরবি গ্লিফ না থাকে)
((int(*)())L"\xfeeb")();
চেষ্টা
goto*&L"ﻫ";
অথবা
goto*&L"\xfeeb";
এই উদাহরণে, eb fe
x86 মেশিনের মতো ভাষা languagefor(;;);
এবং এমন কোনও কিছুর একটি সহজ উদাহরণ যা পরামিতি নেয় না এবং ফিরে আসবে না :-)
দেখা যাচ্ছে যে আপনি goto
এমন কোডিং করতে পারেন যা কলিং পিতামাতার কাছে ফিরে আসে।
#include<stdio.h>
int f(int a){
if(!a)return 1;
goto*&L"\xc3c031"; // return 0;
return 2; // never gets here
}
int main(){
printf("f(0)=%d f(1)=%d\n",f(0),f(1));
}
উপরের উদাহরণটি (এর সাথে লিনাক্স সংকলন এবং চালিত হতে পারে) gcc -O
) স্ট্যাক বিন্যাসের প্রতি সংবেদনশীল।
সম্পাদনা: আপনার সরঞ্জামচেনের উপর নির্ভর করে আপনাকে -zexecstack
সংকলন পতাকা ব্যবহার করতে হতে পারে ।
যদি তা অবিলম্বে প্রকট হয় না, তবে এই উত্তরটি মূলত লোকেদের জন্যই লেখা হয়েছিল। আমি এটি পড়ার থেকে আরও ভাল বা খারাপ গল্ফিং বা প্রতিকূল মানসিক ফলাফলের জন্য কোনও দায় গ্রহণ করি না।