首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是如何用klee符号执行测试有状态API吗?

这是如何用klee符号执行测试有状态API吗?
EN

Stack Overflow用户
提问于 2022-04-01 09:55:15
回答 1查看 72关注 0票数 1

我目前正在测试一些关于如何测试和模糊C API的方法。在此过程中,我找到了克莱,它象征性地运行代码,这意味着它试图覆盖所有依赖于某些符号输入的分支,并检查各种错误。我设法让它开始工作,现在我在问我的方法是好的,还是它有一些重大的缺点或问题。

让我们假设我们有以下简单但有缺陷的API:

代码语言:javascript
复制
#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编写了以下符号测试:

代码语言:javascript
复制
#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吗?或者是否有关于更好方法的文档?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-21 12:31:55

为了用KLEE测试API,确实需要编写一个调用它的驱动程序。您的操作很好,我不知道您为什么要使用for循环?这个较小的例子应该有效:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71705070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档