在执行时以编程方式模拟和测试C函数

在执行时以编程方式模拟和测试C函数,c,functional-testing,C,Functional Testing,昨天我在问自己一个问题 是否可以通过编程方式将对特定函数的所有调用“强制”到程序中,并测试此调用的错误情况是否始终得到正确处理 例如: int main(void) { char *mallocforfun = NULL; char **matrix = NULL; if ((matrix = (char **)malloc(sizeof(char*) * 42))) { for (int i = 0; i < 42; i++)

昨天我在问自己一个问题

是否可以通过编程方式将对特定函数的所有调用“强制”到程序中,并测试此调用的错误情况是否始终得到正确处理

例如:

int main(void)
{
    char *mallocforfun = NULL;
    char **matrix = NULL;
    if ((matrix = (char **)malloc(sizeof(char*) * 42)))
    {
        for (int i = 0; i < 42; i++)
        {
            matrix[i] = (char *)malloc(sizeof(char) * 42);
            bzero(matrix[i], 42);
        }
        matrix[i] = NULL;
    }
    mallocforfun = (char*)malloc(sizeof(char) * 42);
    ...
    // do some stuff and free everything
    return (0);
}
int main(无效)
{
char*mallocforfun=NULL;
字符**矩阵=空;
如果((矩阵=(字符**)malloc(sizeof(字符*)*42)))
{
对于(int i=0;i<42;i++)
{
矩阵[i]=(char*)malloc(sizeof(char)*42);
bzero(矩阵[i],42);
}
矩阵[i]=NULL;
}
mallocforfun=(char*)malloc(sizeof(char)*42);
...
//做点事,把所有的东西都放出来
返回(0);
}
因此,在本例中,如果我们要测试malloc函数,测试人员将放置三个断点:

int main(void)
{
    char *mallocforfun = NULL;
    char **matrix = NULL;
    1st: if ((matrix = (char **)malloc(sizeof(char*) * 42)))
    {
        for (int i = 0; i < 42; i++)
        {
            2nd: matrix[i] = (char *)malloc(sizeof(char) * 42);
            bzero(matrix[i], 42);
        }
        matrix[i] = NULL;
    }
    3rd: mallocforfun = (char*)malloc(sizeof(char) * 42);
    ...
    // do some stuff and free everything
    return (0);
}
int main(无效)
{
char*mallocforfun=NULL;
字符**矩阵=空;
第一个:如果((矩阵=(字符**)malloc(sizeof(字符*)*42)))
{
对于(int i=0;i<42;i++)
{
第二:矩阵[i]=(char*)malloc(sizeof(char)*42);
bzero(矩阵[i],42);
}
矩阵[i]=NULL;
}
第三:mallocforfun=(char*)malloc(sizeof(char)*42);
...
//做点事,把所有的东西都放出来
返回(0);
}
运行程序,将malloc函数return更改为错误值,查看它是否崩溃,删除上次测试的断点,重新运行,等等

我想通过在一个环境中反复运行程序来验证我是否处理了所有的错误返回,在这个环境中,malloc在每个调用站点失败一次,然后在程序的后续运行中依次失败。(感谢@Mic的明确表述)

我认为可以使用gdb脚本使用非剥离二进制文件执行类似操作。我自己找了,但找不到任何像那样的东西


所以我觉得我少了一个“关键词”。你知道这种测试是否有一个特定的名称,或者有一个类似的工具吗?

我不知道你的意思,因为第2段似乎与第2个代码框相矛盾。是否要为所有可能的参数组合生成暴力输入?或者您只是想测试在正常操作期间传递的参数,并确保它们通过特定条件?如果是后者,您只需要
assert()
。这是第二个选项,但我希望在执行时为任何函数动态执行它。在我的例子中,该工具将使用以下命令更改变量值:matrix=NULL->Test program execution flow。矩阵[i]=NULL->测试程序执行流。mallocforfun=NULL->测试程序执行流。你说的“在执行时动态地为任何函数”是什么意思?因此,您不希望必须向源代码中添加调试代码,而是使用调试器附加到源代码,并任意添加断点和/或更改变量?您可以使用对malloc包装器的调用来替换对malloc的所有调用,该包装器可以满足您的需要。模拟malloc功能测试提供了两个很好的答案,一个是在源代码中使用malloc包装器,另一个是在链接阶段使用malloc包装器。请看,由于不同的函数具有不同的语义,很难看到如何自动处理任何函数。你会考虑C++,在哪里例外会解决这个问题?