1.基本块GCC中基本块的达式代码表示
2.表达å¼20+int(rand()*100)çåå¼èå´
3.已知定义int a=2,则表达式 a+=a*=a-=a*a 的值是
基本块GCC中基本块的表示
在GCC中,基本块使用basic_block数据类型表示。解析结构体basic_block内包含next_bb和prev_bb两个指针成员,源码c源用于构成与指令流顺序相同的分析tor源码解析双向链表。操作CFG的达式代码API可以更新这些链接。宏FOR_EACH_BB可用于按字典顺序访问所有基本块。解析walk_dominator_tree则用于进行dominator遍历。源码c源
给定两个基本块A和B,分析若A在B之前被执行,达式代码则A支配B。解析数组BASIC_BLOCK以非指定顺序包含所有基本块,源码c源图片识别源码c每个结构体有一个唯一整数标识符index,分析表示其在数组中的达式代码索引。函数中基本块总数为n_basic_blocks。解析索引和总数在编译过程中可能改变,源码c源且任何块的自动发货APP源码索引都不应超过last_basic_block。
特定的基本块标记为ENTRY_BLOCK_PRT和EXIT_BLOCK_PTR,它们不包含代码,且不是BASIC_BLOCK数组成员,因此拥有唯一的负数索引。每个basic_block包含指向头和尾指令的ca证书助手 源码指针,对于RTL,这些指针指向rtx头和尾。在RTL函数表示中,头总是指向NOTE_INSN_BASIC_BLOCK或CODE_LABEL。指令流包含指令和注解,python 查看类源码移动或复制基本块时,需要更新注解。
跳转表向量以“伪指令”形式表示在insn流中,它们不出现在基本块中,通常在移除table-jump后很难消除相关代码,清除工作被推迟到活跃分析之后。这可能导致跳转表向量在insn流中出现未引用、无用的情况。在任何边成为fall-thru之前,需要调用can_fallthru函数检测。
对于树表示,基本块的头和尾由stmt_list域指向,应避免直接引用这些特定树。相反,使用抽象容器和迭代器在树级别访问基本块中的语句和表达式,这些迭代器称为块语句迭代器(BSI)。在各种tree-*文件中使用grep查找^bsi可以找到相关摘抄,用于打印使用GIMPLE表示的程序的所有语句。
表达å¼+int(rand()*)çåå¼èå´
cplusplusä¸æè¿æ ·çä»ç»ï¼
rand()å½æ°äº§çä¸ä¸ª0å°RAND_MAXç伪éæºæ°ï¼è¿éçRAND_MAXå ä¸åçå®ç°èå¼ï¼ä½RAND_MAXè³å°ä¸ºãï¼æ¯å¦ï¼MSVCä¸é常为0x7fffï¼å³ï¼èLinuxå¹³å°ä¸GCCä¸RAND_MAXé常ä¼è¿è¿å¤§äºè¿ä¸ªå¼ï¼
æ以ï¼
+ (int)(rand()*)
å°±æ¯+[0ï¼]=[ï¼]
已知定义int a=2,则表达式 a+=a*=a-=a*a 的值是
这个表达式无意义,编译器会给出警告信息。该表达式的值与编译器相关非要执行,看一下这句在GCC给出的反汇编
0x mov eax,0x10xb sub eax,DWORD PTR [esp+0xc]
0xf mov edx,DWORD PTR [esp+0xc]
0x imul eax,edx
0x mov DWORD PTR [esp+0xc],eax
0xa mov eax,DWORD PTR [esp+0xc]
0xe mov edx,DWORD PTR [esp+0xc]
0x imul eax,edx
0x mov DWORD PTR [esp+0xc],eax
0x mov eax,DWORD PTR [esp+0xc]
0xd add DWORD PTR [esp+0xc],eax
0xa1 mov eax,0x0