ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用 grammars-v4 测试套件验证 C 编译器结构体支持:chapter_18 `no_structure_parameters` 测试组织与调试指南

用 grammars-v4 测试套件验证 C 编译器结构体支持:chapter_18 `no_structure_parameters` 测试组织与调试指南 编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载导读在编写 C 编译器时结构体struct支持是最具挑战性的里程碑之一它同时涉及类型系统标签解析、类型完备性、代码生成大小与成员偏移计算、表达式语义./-成员访问以及存储语义自动/静态初始化。本文基于 grammars-v4 仓库中随附的 C 编译器测试套件writing-a-c-compiler-tests第 18 章的子集——no_structure_parameters/README.md——系统讲解该测试目录的组织方式、每一类测试的验证目标以及推荐的调试顺序。读完本文你将掌握如何按图索骥地使用这些测试用例排查结构体类型声明、初始化、成员访问、大小计算等功能的实现缺陷。测试范围界定本目录验证什么、不验证什么第 18 章valid目录下按结构体参数支持程度分成了三组本 README 只管辖其中一组——no_structure_parameters/。其边界定义非常明确见 README.md不验证把整个结构体作为函数参数传递或作为返回值返回允许传递指向结构体的指针作为参数或返回值这类用例也出现在libraries/中验证结构体类型声明、复合初始化compound initializer、成员访问.与-、结构体整体复制等完整基础能力。换句话说这个目录是一个结构体支持前半程的验收关卡——在实现按值传结构体/返回结构体对应同级的 parameters 与 params_and_returns之前必须先通过这些测试。配套的语法层面支撑可以在仓库的 CParser.g4 与 CLexer.g4 中查看structOrUnionSpecifier、structDeclaration、postfixExpression等规则定义了结构体声明与./-成员访问的语法。测试套件中的invalid_*目录则从反面验证语法与类型检查的健壮性。测试目录全景七个维度的分层验证no_structure_parameters/下共 53 个文件42 个.c、10 个.h、1 个.md按测试目的分为 7 个目录目录核心验证目标典型文件smoke_tests/结构体类型声明、复合初始化、成员访问的冒烟测试simple.c,static_vs_auto.cparse_and_lex/解析器与词法分析器对边界情况的接受度postfix_precedence.c,trailing_comma.csemantic_analysis/标识符解析与类型检查标签解析、类型完备性、不完整类型resolve_tags.c,incomplete_structs.csize_and_offset_calculations/结构体大小与成员偏移计算sizeof_exps.c,struct_sizes.hscalar_member_access/.与-运算符的标量成员访问dot.c,arrow.c,nested_struct.cstruct_copy/结构体整体复制赋值、经./-/[]读写copy_struct.c,stack_clobber.clibraries/多翻译单元测试全局结构体、初始化、指针参数/返回值global_struct.c,opaque_struct.c值得注意的是README 特别说明size_and_offset_calculations/中的测试只通过和sizeof运算符计算大小与偏移不实际读写任何结构体或成员——这意味着它们可以独立于内存读写代码生成正确性先验证布局计算。smoke_tests从最小用例出发这是推荐的第一个调试目标用于确认最基础的能力链路是否打通。simple.c 展示了最小闭环struct pair { int a; int b; }; int main(void) { struct pair x {1, 2}; // 声明 复合初始化 if (x.a ! 1 || x.b ! 2) { // . 运算符读取 return 1; } struct pair *x_ptr x; if (x_ptr-a ! 1 || x_ptr-b ! 2) { // - 运算符读取 return 2; } return 0; }static_vs_auto.c 则进一步验证存储期初始化语义在循环中同时声明struct s autom {1, 2};自动存储期与static struct s stat {1, 2};静态存储期每次迭代都自增成员。到第 10 次迭代时stat的成员被递增了 10 次期望值为{11, 12}——验证静态结构体只初始化一次autom每次进入作用域被重新初始化期望值为{2, 3}——验证自动结构体每次进入作用域都重新初始化。这一用例直接检验了存储分配与初始化代码生成的正确区分是排查初始化时机错误类缺陷的关键样本。size_and_offset_calculations布局计算的黄金样本该目录使用共享头文件 struct_sizes.h 定义了一组精心设计的结构体覆盖了丰富的布局场景成员对齐与尾部填充struct eight_bytes由intchar组成末尾补 3 字节使总大小成为 4 的倍数8 字节嵌套结构体与内部填充struct sixteen_bytes嵌套了 8 字节、2 字节、3 字节三个子结构体合计 13 字节后再补 3 字节到 16 字节成员间填充struct twentyfour_bytes中seven7 字节后需补 1 字节才能让 4 字节对齐的sixteen从偏移 8 开始非 2 的幂大小struct wonky是 19 字节的char数组无填充更大对齐成员struct internal_padding中char后补 7 字节使double8 字节对齐总大小 16 字节。sizeof_exps.c 则对表达式而非仅类型名应用sizeof逐一断言期望值例如sizeof arr_struct.struct_array[2]应等于 8数组元素类型struct eight_bytes的大小——验证下标表达式类型推断sizeof arr_struct.struct_array应等于 24 而非经数组退化后的 8——显式验证数组在sizeof中不发生退化注释中专门强调 make sure arr_struct.struct_array doesnt undergo array decay heresizeof *get_twentybyte_ptr()应等于 20——验证函数返回指针的解引用类型推断。member_offsets.c与member_comparisons.c则通过运算符比较成员地址进一步校验每个成员的偏移量是否符合上述布局预期。scalar_member_access.与-的读写闭环dot.c 以struct four_members { double d; char c; long l; char *ptr; }为对象系统验证了写成员将复杂表达式如函数调用get_double() * 2.0、静态全局变量除法l / 4的结果赋给成员读成员直接比较成员值取成员地址autom.d赋给double *后解引用成员参与函数调用把成员含派生值作为实参传入accept_params在函数内校验同一套用例分别在自动存储期test_auto与静态存储期test_static结构体上各跑一遍。nested_struct.c、linked_list.c和arrow.c则覆盖嵌套标量成员访问与链表式-链式访问但正如 README 所说none require copying an entire structure to another location——嵌套访问只取标量成员不整体搬移结构体。struct_copy结构体整体复制语义这是本目录中功能上最重的一类验证把整个结构体从一个位置复制到另一个位置的能力。struct_copy/ 中的用例包括copy_struct.c结构体变量之间的整体赋值copy_struct_through_pointer.c经指针间接复制copy_struct_with_dot_operator.c/copy_struct_with_arrow_operator.c通过.与-运算符读写整个结构体成员成员本身是结构体stack_clobber.c与[]运算符配合的整体读写。共享的structs.h定义被测类型。这些用例实际上是按值传参/返回的前置验证——只有结构体能整体复制params_and_returns/中的高级特性才有实现基础。semantic_analysis标签解析与类型完备性resolve_tags.c 是本章最全面的类型系统用例之一覆盖了结构体标签tag在不同上下文中的解析变量声明中的标签遮蔽内层作用域定义同名struct shadow后外层变量outer仍保留原类型内外成员均可访问成员声明中的自引用struct s *self_ptr;在成员声明中指向正在定义的这个struct s而非文件作用域的同名类型函数声明中的标签解析内层struct s离开作用域后函数声明自动回退到外层类型for 循环头中的结构体声明for (struct s loop_struct {10}; ...)与循环体内的同名新类型共存cast 表达式与 sizeof 中的标签sizeof(struct s)在内层是 15 字节、外层是 8 字节验证标签按作用域解析派生类型struct s *(*outer_arr)[3]这类指向 3 个指针数组的指针中的标签解析无成员列表的标签声明是无操作struct s;若当前作用域已声明过该标签则什么都不做。配合incomplete_structs.c、namespaces.c结构体标签与普通标识符位于不同命名空间与cast_struct_to_void.c共同验证标签解析、类型完备性跟踪、不完整结构体的合法使用。parse_and_lex语法层的边界情况该目录的用例保证词法与语法分析器不误拒合法代码例如postfix_precedence.c验证后缀运算符优先级高于前缀——-array[2].b.inner_arr[1]实际是-(array[2].b.inner_arr[1])同时覆盖结构体数组的复合初始化嵌套{{...}}初始化器space_around_struct_member.c.与-两侧空白的宽容处理struct_member_looks_like_const.c成员名恰好看似关键字/常量名时的消歧trailing_comma.c初始化列表尾部逗号的合法接受。libraries多翻译单元下的结构体libraries/模拟真实工程的链接场景包含.c与配套.h的成对用例全局结构体跨翻译单元global_struct.c 中update_struct读写头文件声明的全局结构体成员global_struct_client.c从另一个翻译单元访问同一结构体结构体指针参数/返回值param_struct_pointer.c与return_struct_pointer.c验证指针传参与返回这是本目录允许的边界不透明结构体opaque_struct.c验证声明了标签但成员不可见的不完整类型场景初始化器位置语义libraries/initializers/下的四组用例auto_struct_initializers、static_struct_initializers及各自的nested_*变体专门验证结构体初始化器在正确位置写入正确的值覆盖自动/静态存储期与嵌套初始化。推荐的调试顺序与使用建议README 给出的调试顺序本身就是一个从浅到深、先易后难的排错路线图smoke_tests/—— 先打通声明、初始化、成员访问的最小链路size_and_offset_calculations/—— 独立验证布局计算不依赖内存读写scalar_member_access/—— 验证./-的完整读写与寻址libraries/initializers/—— 提前验证初始化器语义parse_and_lex/—— 补齐语法层边界struct_copy/—— 攻坚整体复制semantic_analysis/—— 最后系统验证类型系统细节libraries/其余用例 —— 收尾验证多翻译单元。调试时建议遵循以下原则每个测试文件都是独立的可执行程序约定返回 0 表示成功、非 0 表示失败返回码还用于区分不同的失败分支可以直接编译运行逐一验证先跑冒烟再跑语义语法/词法问题会阻塞所有后续阶段因此parse_and_lex虽靠后列出但如果冒烟测试都过不了应优先排查语法规则善用invalid_对照本章同级目录如 invalid_parse、invalid_types提供了应当报错的用例与valid/形成对照可用于回归测试误接受与误拒绝两类缺陷以 ANTLR 语法为参照当某个用例解析失败时对照 CParser.g4 检查structDeclaration、initDeclaratorList、postfixExpression等规则是否覆盖了对应语法形态。小结no_structure_parameters/是一个精心分层、边界清晰的 C 编译器结构体功能测试集它把结构体支持拆解为冒烟、解析、语义、布局、成员访问、整体复制与多翻译单元七个可独立调试的维度并明确划出不传结构体值参/返回值这一阶段边界。按照 README 给出的顺序逐层推进配合invalid_*对照用例与 CParser.g4 语法参照可以系统性地定位结构体相关实现中的每一类缺陷为后续实现按值传参/返回结构体parameters/ 与 params_and_returns/打下坚实基础。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐用整条优化管线端到端测试验证 C 编译器收敛grammars-v4 仓库 chapter_19 whole_pipeline 测试集解析用整条优化管线端到端测试验证 C 编译器收敛grammars v4 仓库 chapter_19 whole_pipeline 测试集解析 导读 本指南聚焦于编程语言编译器开发工具ToolJet 审计日志落盘指南基于 LOG_FILE_PATH 配置日志文件生成RsyslogToolJet 审计日志落盘指南基于 LOG_FILE_PATH 配置日志文件生成Rsyslog ToolJet 的 日志文件log file 功能为测试开发工具MPark.Patterns与C标准提案P1371的关系探索模式匹配的未来演进MPark.Patterns与C标准提案P1371的关系探索模式匹配的未来演进 MPark.Patterns是一个为C17设计的实验性模式匹配库它通后端上一篇最完整解析Binwalk项目在Python 3.12环境下的兼容性问题与解决方案下一篇FluentFlyout 媒体控制功能详解封面显示、播放控制与音频管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表