Sử dụng lambdas (không thể di chuyển)
Thay vì
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
hoặc (chỉ gcc)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
hoặc (llvm với khối hỗ trợ)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
thử một cái gì đó như
qsort(a,b,4,"\x8b\7+\6\xc3");
... Trong đó chuỗi trích dẫn chứa các hướng dẫn ngôn ngữ máy của chức năng "lambda" của bạn (tuân thủ tất cả các yêu cầu ABI của nền tảng).
Điều này hoạt động trong môi trường trong đó các hằng chuỗi được đánh dấu thực thi. Theo mặc định, điều này đúng trong Linux và OSX nhưng không phải Windows.
Một cách ngớ ngẩn để học cách viết các hàm "lambda" của riêng bạn là viết hàm trong C, biên dịch nó, kiểm tra nó với một cái gì đó giống như objdump -D
và sao chép mã hex tương ứng thành một chuỗi. Ví dụ,
int f(int*a, int*b){return *a-*b;}
... khi được biên dịch với gcc -Os -c
mục tiêu Linux x86_64 sẽ tạo ra một cái gì đó như
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
GNU CC goto
:
Bạn có thể gọi trực tiếp các "hàm lambda" này nhưng nếu mã bạn đang gọi không lấy tham số và sẽ không trả về, bạn có thể sử dụng goto
để lưu một vài byte. Vì vậy, thay vì
((int(*)())L"ﻫ")();
hoặc (nếu môi trường của bạn không có glyphs tiếng Ả Rập)
((int(*)())L"\xfeeb")();
Thử
goto*&L"ﻫ";
hoặc là
goto*&L"\xfeeb";
Trong ví dụ này, eb fe
là ngôn ngữ máy x86 cho một cái gì đó giống như for(;;);
và là một ví dụ đơn giản về thứ gì đó không lấy tham số và sẽ không trả về :-)
Hóa ra bạn có thể goto
mã trở lại cho cha mẹ đang gọi.
#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));
}
Ví dụ trên (có thể biên dịch và chạy trên Linux với gcc -O
) rất nhạy cảm với bố cục ngăn xếp.
EDIT: Tùy thuộc vào chuỗi công cụ của bạn, bạn có thể phải sử dụng -zexecstack
cờ biên dịch.
Nếu nó không rõ ràng ngay lập tức, câu trả lời này chủ yếu được viết cho các lols. Tôi không chịu trách nhiệm cho việc chơi golf tốt hơn hoặc tồi tệ hơn hoặc kết quả tâm lý bất lợi từ việc đọc này.