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函数尝试匹配的主要内容,如果未能解决你的问题,请参考以下文章

C函数尝试匹配

C函数尝试匹配

C函数尝试匹配

阿里测评——靶子

科技云报道:疫情三年,数字会展成色几何?

战旗直播lyingman第六季再攀双高 专业成色拷问抄袭者生存