AI开发C语言应用按步走,表达式计算器calc的第二十步,魔法数修复、测试分隔符、位运算截断检查、进制溢出检查

发布时间:2026/7/27 18:59:55
AI开发C语言应用按步走,表达式计算器calc的第二十步,魔法数修复、测试分隔符、位运算截断检查、进制溢出检查 calc20 — 魔法数修复、测试分隔符、位运算截断检查、进制溢出检查1. 概述本次迭代从 suggestions.md 中选取了 4 个待改进项进行修复涵盖代码质量、测试框架和运行时健壮性三个方面。修复项编号问题类型C1var_name[32]魔法数代码质量G3测试文件分隔符与表达式分隔符;冲突测试框架G4位运算截断int无警告运行时健壮性G5进制数溢出无检查运行时健壮性2. 变更清单文件操作说明main.c编辑var_name[32]→var_name[MAX_NAME]2 处test.expr编辑分隔符;→反引号避免与表达式分隔符;冲突Makefile编辑IFS;→IFS\eval.c编辑新增#include limits.hcheck_int_trunc()函数6 处(int)转换前添加截断检查parse.c编辑新增#include errno.h#include stdio.h3 处strtoul后添加errno ERANGE溢出检查3. C1 —var_name[32]魔法数3.1 改造前charvar_name[32];硬编码的 32与parse.h中Token.name[32]无显式关联。3.2 改造后charvar_name[MAX_NAME];MAX_NAME在parse.h中定义为32两处统一引用修改一端时同步更新。4. G3 — 测试文件分隔符4.1 问题test.expr使用;作为字段分隔符但;现在也是合法的表达式分隔符表达式分隔功能导致1;2;3等表达式无法在测试文件中使用。4.2 方案将分隔符改为反引号原因反引号在 calc 的词法分析器中永远为非法字符TOKEN_ERROR不会与任何合法表达式冲突。文件改动test.expr;→MakefileIFS;→IFS\同时保留了;作为表达式分隔符的功能不变。5. G4 — 位运算截断检查5.1 问题eval.c中位运算操作数先转为int32 位超出INT_MAX2147483647的值被静默截断用户得不到提示。5.2 方案新增check_int_trunc函数在 6 处(int)转换前调用staticintcheck_int_trunc(longdoublev){if(vINT_MAX||vINT_MIN){fprintf(stderr, warning: value truncated to int\n);return1;}return0;}调用位置parse_bitor、parse_bitxor、parse_bitand、parse_shiftSHL/SHR、parse_unaryBITNOT。6. G5 — 进制数溢出检查6.1 问题parse.c中strtoul解析十六进制/二进制/八进制数字时超出unsigned long范围的值被静默截断为ULONG_MAX用户得不到提示。6.2 方案在每个strtoul调用前重置errno 0调用后检查errno ERANGEerrno0;val(longdouble)strtoul(input_pos,end,16);if(errnoERANGE)fprintf(stderr, warning: integer overflow\n);7. 测试验证$maketestcalc — 测试套件122passed,0failed,122total全部 122 个回归测试通过功能不变新增的检查仅在溢出/截断时输出警告不影响正常计算结果。