国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

App下載

邪修 C 語言 10 連擊|計算型 goto、零長數(shù)組、運行時改機器碼

編程獅(w3cschool.cn) 2025-08-07 11:41:33 瀏覽數(shù) (330)
反饋

邪修 C 語言,10 段“直接勸退”的黑魔法代碼
——僅供技術(shù)獵奇,切勿上生產(chǎn)!

編譯器警告、UB(未定義行為)、UBSAN 狂怒,請自備防護眼鏡 ??

1?? 一行 main 都沒有的程序

#include <stdio.h>
void _start(){puts("邪修C");}

鏈接時加 -nostartfiles,直接跳過 CRT,Linux 裸奔。

2?? Duff’s Device —— switch 跳進 while

void evil_memcpy(char *dst, char *src, size_t n){
    switch(n & 7){
        case 0: while(n--){ *dst++ = *src++;
        case 7: *dst++ = *src++;
        case 6: *dst++ = *src++;
        case 5: *dst++ = *src++;
        case 4: *dst++ = *src++;
        case 3: *dst++ = *src++;
        case 2: *dst++ = *src++;
        case 1: *dst++ = *src++;
                }break;
    }
}

循環(huán)展開 + switch 套 while,上古時代“手動 SIMD”。

3?? 宏黑魔法:讓 if 變成代碼塊

#define evil_if(x) if(x);else


evil_if(0)
    puts("你猜我會打印嗎?");

宏定義末尾的分號把 else 直接懸空,編譯器當場裂開。

4?? 指針運算玩出花

int a[5] = {1,2,3,4,5};
printf("%d\n", 3[a]); // 輸出 4

a[3]3[a] 等價,編譯器:你們開心就好。

5?? 結(jié)構(gòu)體“零長度數(shù)組”末班車

struct msg {
    int len;
    char data[0]; // 邪修柔性數(shù)組
};
struct msg *m = malloc(sizeof *m + 100);
strcpy(m->data, "hello");

0 長度數(shù)組是 GNU 私貨,標準 C99 請用 char data[]。

6?? 位域重疊 + 聯(lián)合體重寫

union {
    struct { unsigned a:4, b:4; } nibble;
    unsigned char byte;
} u = {.byte = 0xAB};
printf("%x %x\n", u.nibble.a, u.nibble.b); // 平臺決定大小端

一步踏進 未定義行為 的大坑。

7?? 自修改機器碼(mmap 版)

#include <sys/mman.h>
char *code = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
                  MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
unsigned char payload[] = {0x48,0xC7,0xC0,0x01,0x00,0x00,0x00,0xC3}; // x86-64: mov rax,1; ret
memcpy(code, payload, sizeof payload);
int (*ret1)(void) = (int (*)(void))code;
printf("ret=%d\n", ret1());

運行時生成 shellcode,殺毒軟件直接報警。

8?? 多重 sizeof 套娃

printf("%zu\n", sizeof sizeof sizeof "abc"); // 輸出 8(64 位指針)

連續(xù) sizeof 把任何表達式剝成 size_t,毫無營養(yǎng)。

9?? 逗號運算符“一行流”

int x = (printf("a\n"), printf("b\n"), 3);
printf("%d\n", x); // 依次打印 a b 3

把副作用寫進表達式,debug 時想打人。

?? GOTO 地獄 + 標簽運算

int main(){
    static const void *tab[] = {&&l0, &&l1, &&l2};
    int i = 1;
    goto *tab[i];
l0: puts("zero"); return 0;
l1: puts("one");  return 0;
l2: puts("two");  return 0;
}

計算型 goto(GNU C 擴展)手寫跳轉(zhuǎn)表。

邪修口訣

“內(nèi)存隨便指,宏里藏殺機,UB 當特性,編譯器哭泣。”

C

0 人點贊