我目前正在测试一些关于如何测试和模糊C API的方法。在此过程中,我找到了克莱,它象征性地运行代码,这意味着它试图覆盖所有依赖于某些符号输入的分支,并检查各种错误。我设法让它开始工作,现在我在问我的方法是好的,还是它有一些重大的缺点或问题。
让我们假设我们有以下简单但有缺陷的API:
#include <assert.h>
static int g_state;
void setState(int state) {
g_state = state;
}
void run(void) {
if (g_state == 123) {
assert(0);
}
}如果状态设置为123,然后调用run(),则放置断言将失败。
为此,我用KLEE编写了以下符号测试:
#include "klee/klee.h"
#include "buggy_api.h"
int main(void) {
for (int i = 0; i < 2; ++i) { // sequentially call 2 APIs
int f_select = klee_choose(2); // what API to call
if (f_select == 0) {
int state = 0;
klee_make_symbolic(&state, sizeof(state), "state");
setState(state);
} else if (f_select == 1) {
run();
}
}
return 0;
}在与KLEE一起运行时,几乎可以立即找到触发断言所需的调用序列。然后,我尝试用一些其他函数扩展API,并将断言隐藏在状态组合的后面。KLEE再次发现了植入的窃听器,但自然要花更长的时间。
这就是我如何有效地使用KLEE来检查API吗?或者是否有关于更好方法的文档?
发布于 2022-05-21 12:31:55
为了用KLEE测试API,确实需要编写一个调用它的驱动程序。您的操作很好,我不知道您为什么要使用for循环?这个较小的例子应该有效:
#include "klee/klee.h"
#include "buggy_api.h"
int main(void) {
int state;
klee_make_symbolic(&state, sizeof(state), "state");
setState(state);
run();
return 0;
}https://stackoverflow.com/questions/71705070
复制相似问题