Використовуйте лямбда (не повідомляється)
Замість
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;}));
або (llvm з підтримкою блоків)
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 платформи).
Це працює в середовищах, у яких рядкові константи позначені як виконувані. За замовчуванням це справедливо в Linux та OSX, але не в Windows.
Один нерозумний спосіб навчитися писати власні функції "лямбда" - це написати функцію на C, компілювати її, оглянути її з чимось на зразок objdump -D
та скопіювати відповідний шістнадцятковий код у рядок. Наприклад,
int f(int*a, int*b){return *a-*b;}
... при компіляції з gcc -Os -c
для цілі Linux 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));
}
Вищеописаний приклад (може компілюватися та працювати в Linux з gcc -O
) чутливий до макета стека.
EDIT: Залежно від вашої ланцюжка інструментів, можливо, вам доведеться використовувати -zexecstack
прапор компіляції.
Якщо це не відразу зрозуміло, ця відповідь була написана в основному для лолів. Я не несу відповідальності за кращий чи гірший гольф чи несприятливі психологічні наслідки, читаючи це.