Представьте, что у меня есть набор макросов в программе (macrotest.c), например:
#include <stdio.h>
#include <stdlib.h>
#define n1 75
#define n2 90
#define mac(x,y) ((x > y) ? (12) : (15))
int main(){
printf("%d",mac(n1,n2));
exit(0);
}
Когда вы компилируете в сборку (EM64T), вы получаете следующее:
gcc -S -o macrotest.asm macrotest.c
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %eax
movl $15, %esi <------ This
movq %rax, %rdi
movl $0, %eax
call printf
movl $0, %edi
call exit
.cfi_endproc
Вы можете видеть, что он немедленно преобразует mac (n1, n2) в 15.
Однако, когда вы компилируете на этапе предварительной обработки, он просто расширяет макросы:
gcc -E -o macrotest.prp macrotest.c
int main(){
printf("%d",((75 > 90) ? (12) : (15)));
exit(0);
}
Есть ли какой-нибудь способ, которым я могу далее сломать код C , не входя в сборку?