C函数尝试匹配
Posted 资质平庸的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C函数尝试匹配相关的知识,希望对你有一定的参考价值。
C函数尝试匹配
不知缘起何处,如今已草草写了一个C函数尝试匹配工具。它大概可以从能通过编译的纯C源文件中匹配出C函数定义——即匹配C函数定义因子
修饰 返回值类型 函数名 参数列表
的自由组合模式。可以用它来支持一些不太重要的偷懒行为:
- 声明
- 单元测试函数全覆盖
对于C函数定义因子自由组合模式的匹配大概有以下两种困难:
- C函数体能产生极大干扰,处理策略是跳过函数体。
- 注释、引号会产生干扰,处理策略是删除掉它们。
以 ln_co.c 为靶子试试它的成色。
1 作声明
1.1 匹配函数定义
$ awk -f tryfun ln_co.c try=declare
results in cfnof...
done.
$ cat cfnof
static bool _put_unit_ci(ci_s *ci, int nr);
static bool inline _put_cc(cc_s *cc);
/* 节约篇幅省略多行 */
void * co_send(ci_s *ci);
int co_yield(ci_s *ci);
void * co_yield_from(cc_s *cc, ci_s *self, char *id, void *co, void *arg);
/* ... */
1.2 匹配全局函数定义
$ awk -f tryfun ln_co.c try=declare decorate=extern cfnof=_clear
results in cfnof...
done.
$ cat cfnof
/* ... */
void * co_send(ci_s *ci);
int co_yield(ci_s *ci);
void * co_yield_from(cc_s *cc, ci_s *self, char *id, void *co, void *arg);
/* ... */
1.3 匹配静态函数定义
$ awk -f tryfun ln_co.c try=declare decorate=static cfnof=_clear
results in cfnof...
done.
$ cat cfnof
static bool _put_unit_ci(ci_s *ci, int nr);
static bool inline _put_cc(cc_s *cc);
/* ... */
2 单元测试——函数全覆盖
对C函数类型参数的处理需要有一定考虑,此处的处理方式是直接将函数类型参数传值NULL。
2.1 随机调用一下
$ awk -f tryfun ln_co.c try=randcall cfnof=_clear
results in cfnof...
done.
$ cat cfnof
ci_s *ci = NULL;
int nr;
_put_unit_ci(ci, nr);
/* ... */
cc_s *cc = NULL;
ci_s *self = NULL;
char *id = NULL;
void *co = NULL;
void *arg = NULL;
co_yield_from(cc,self,id,co,arg);
/* ... */
2.2 随机调用输出到 google test 单元测试框架中
这个标题下功能是工具的默认行为,有偷懒功利性嫌疑。
$ awk -f tryfun ln_co.c cfnof=_clear
results in cfnof...
done.
$ cat cfnof
TEST(_put_unit_ci_t, case0)
ci_s *ci = NULL;
int nr;
_put_unit_ci(ci, nr);
/* ... */
TEST(co_yield_t, case0)
ci_s *ci = NULL;
co_yield(ci);
TEST(co_yield_from_t, case0)
cc_s *cc = NULL;
ci_s *self = NULL;
char *id = NULL;
void *co = NULL;
void *arg = NULL;
co_yield_from(cc,self,id,co,arg);
/* ... */
try, decorate, cfnof 的结合使用应该就不用一一展示了。
3 增加一点挑战性
以上内容似乎国内平均大二上学生就能搞定,不如增加一点难度达到国内平均大二下水平——随机去除 ln_co.c 中的一些换行使之大概变成以下样子:
int co_yield(ci_s *ci)/*节约列省略多字符*/return rv;/*紧跟定义*/void * co_yield_from(cc_s *cc, ci_s *self, char *id, void *co, void *arg)int ret;ci_s *ci = NULL; /*...*/return rv;/*...*/
再尝试匹配看:
$ awk -f tryfun ln_co.c cfnof=_clear
results in cfnof...
done.
$ cat cfnof
/* ... */
TEST(co_yield_t, case0)
ci_s *ci = NULL;
co_yield(ci);
TEST(co_yield_from_t, case0)
cc_s *cc = NULL;
ci_s *self = NULL;
char *id = NULL;
void *co = NULL;
void *arg = NULL;
co_yield_from(cc,self,id,co,arg);
/* ... */
4 护短
尽管C函数尝试匹配工具能处理一点挑战,但它不能应对所有的挑战,这是很正常的。如果遇到不能通过修复该工具去完成相应的挑战,还是回归手动模式去完成相应功能,手动模式理应才是最自然的。
以上是关于C函数尝试匹配的主要内容,如果未能解决你的问题,请参考以下文章