Gunakan lambdas (tidak dapat diangkut)
Dari pada
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
atau (hanya gcc)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
atau (llvm dengan dukungan balok)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
coba sesuatu seperti
qsort(a,b,4,"\x8b\7+\6\xc3");
... di mana string yang dikutip berisi instruksi bahasa mesin dari fungsi "lambda" Anda (sesuai dengan semua persyaratan platform ABI).
Ini berfungsi di lingkungan di mana konstanta string ditandai dapat dieksekusi. Secara default ini benar di Linux dan OSX tetapi tidak di Windows.
Salah satu cara konyol untuk belajar menulis fungsi "lambda" Anda sendiri adalah menulis fungsi dalam C, mengompilasinya, memeriksanya dengan sesuatu seperti objdump -D
dan menyalin kode hex yang sesuai ke dalam sebuah string. Sebagai contoh,
int f(int*a, int*b){return *a-*b;}
... ketika dikompilasi dengan gcc -Os -c
untuk target Linux x86_64 menghasilkan sesuatu seperti
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
GNU CC goto
:
Anda dapat memanggil "fungsi lambda" ini secara langsung tetapi jika kode yang Anda panggil tidak mengambil parameter dan tidak akan kembali, Anda dapat menggunakan goto
untuk menyimpan beberapa byte. Jadi, bukannya
((int(*)())L"ﻫ")();
atau (jika lingkungan Anda tidak memiliki mesin terbang Arab)
((int(*)())L"\xfeeb")();
Mencoba
goto*&L"ﻫ";
atau
goto*&L"\xfeeb";
Dalam contoh ini, eb fe
adalah bahasa mesin x86 untuk sesuatu seperti for(;;);
dan merupakan contoh sederhana dari sesuatu yang tidak mengambil parameter dan tidak akan kembali :-)
Ternyata Anda bisa goto
kode yang kembali ke induk panggilan.
#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));
}
Contoh di atas (mungkin dikompilasi dan dijalankan di Linux dengan gcc -O
) sensitif terhadap tata letak tumpukan.
EDIT: Bergantung pada rantai alat Anda, Anda mungkin harus menggunakan -zexecstack
flag kompilasi.
Jika tidak segera terlihat, jawaban ini terutama ditulis untuk lol. Saya tidak bertanggung jawab untuk bermain golf yang lebih baik atau lebih buruk atau hasil psikologis yang merugikan dari membaca ini.