ලැම්බඩාස් (භාවිතා කළ නොහැකි) භාවිතා කරන්න
වෙනුවට
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
හෝ (gcc පමණි)
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");
... මෙහි වචනාර්ථයෙන් ඔබේ "ලැම්බඩා" ශ්රිතයේ යන්ත්ර භාෂා උපදෙස් අඩංගු වේ (සියලුම වේදිකා ABI අවශ්යතාවයන්ට අනුකූල වේ).
මෙය ක්රියාත්මක වන්නේ නූල් නියතයන් ක්රියාත්මක කළ හැකි ලෙස සලකුණු කර ඇති පරිසරවල ය. පෙරනිමියෙන් මෙය ලිනක්ස් සහ ඕඑස්එක්ස් වල සත්ය වන නමුත් වින්ඩෝස් නොවේ.
ඔබේම "ලැම්බඩා" ශ්රිත ලිවීමට ඉගෙන ගත හැකි එක් මෝඩ ක්රමයක් නම්, ශ්රිතය C හි ලිවීම, එය සම්පාදනය කිරීම, එය වැනි දෙයක් සමඟ පරීක්ෂා කර 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
එම්ඩී එක්ස්එෆ් සරල "ලැම්බඩා" කාර්යයන් ලිවීමට උපකාරී වන බාෂ් පිටපතක් ලිවීය .
GNU CC goto
:
ඔබට මෙම "ලැම්බඩා කාර්යයන්" කෙලින්ම ඇමතිය හැකි නමුත් ඔබ අමතන කේතය පරාමිතීන් නොගෙන නැවත නොඑන්නේ නම්, ඔබට goto
බයිට් කිහිපයක් ඉතිරි කිරීමට භාවිතා කළ හැකිය . ඒ වෙනුවට
((int(*)())L"ﻫ")();
හෝ (ඔබේ පරිසරයට අරාබි ග්ලයිෆස් නොමැති නම්)
((int(*)())L"\xfeeb")();
උත්සාහ කරන්න
goto*&L"ﻫ";
හෝ
goto*&L"\xfeeb";
මෙම උදාහරණයේ දී, eb fe
x86 යන්ත්ර භාෂාව වැනි දෙයක් සඳහා වන for(;;);
අතර එය පරාමිතීන් නොගෙන නැවත නොඑන දෙයකට සරල උදාහරණයකි :-)
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
(gcc සඳහා) හෝ -Wl,-z,execstack
(ක්ලැන්ග් සඳහා) සම්පාදක ධජය භාවිතා කිරීමට සිදුවනු ඇත .
එය ක්ෂණිකව නොපෙනේ නම්, මෙම පිළිතුර ප්රධාන වශයෙන් ලියා ඇත්තේ ලොල්වරුන් සඳහා ය. මෙය කියවීමෙන් වඩා හොඳ හෝ නරක ගොල්ෆ් ක්රීඩා කිරීම හෝ අහිතකර මානසික ප්රති come ල සඳහා මම කිසිදු වගකීමක් නොගනිමි.