c语言 - 如何摆脱静态分析报告中的"tainted parameter"?



我正在使用Parasoft来分析我的代码。我去这个违规:

入口点方法("in文件名")的污染参数已打印在控制台上

这是错误所在的代码:

static void printUsage(char *inFileName)
{
    printf("Usage: %s %sn", inFileName, "[-h|-help|-usage]n");
}
int main(int argc, char **argv)
{
    printUsage(argv[0]);
    return 0;
}

inFileNAme实际上argv[0]的地方.

我怎样才能解决违规问题或至少让 Parasoft 满意?

您可能会收到此警告,因为您没有正确清理程序参数。例如,如果您将获得一个未终止的字符串,则printf中的%s说明符将使程序继续读取(和打印)内存,从而导致未定义的行为和安全问题。

至于什么是"污点参数":

在软件安全分析中,如果值被污染,则称为受污染 来自不受信任的来源(超出程序控制范围)并且 未经消毒以确保其符合任何限制 关于价值的消费者需要的值 - 例如,所有 字符串以 null 结尾。

(来源)(强调我的)

为了确保您的输入值正确,您可以使用类似 strdup .... 的函数:

static void printUsage(char *inFileName)
{
    char *inFile = strdup(inFileName);
    if (inFile == 0) {
    printf("Error with program Argument.");
    }else{
    printf("Usage: %s %sn", inFile, "[-h|-help|-usage]n");
    free(inFile);}
}
int main(int argc, char **argv)
{
    printUsage(argv[0]);
    return 0;
}

我假设 strdup 知道如何处理 NULL 指针(因为您没有检查)?

此外,查看手册页 strdup 会添加一个"\0",以便满足正确终止字符串的要求。 这足以阻止Coverity认为这根绳子被污染了吗?

更一般的答案可能包括在执行任何其他操作之前对 inFileName != NULL 进行额外检查。

相关内容

最新更新