1

对于以下代码,klocwork 报告Unvalidated integer value 'val' is received from 'atoi' and can be used to access array

int main(int argc, char **argv)
{
    int i = 0;
    int val = 0;
    for (i = 0; i < argc; i++)
    {
        if (argv[i])
        {
            val = atoi(argv[i]);
            ......
            ......
        }
    }
    return 0;
}

我不知道如何解决这个问题。如果 argv[i] 不是数字,则 atoi 将返回 0。 klocwork 在这里期望什么?

4

3 回答 3

6

好吧,这里第一个明显的建议是:停止使用atoi. atoi是用于草图,而不是用于实际代码。atoi没有任何故障反馈机制,并在溢出时产生未定义的行为。在 C95 中,来自ato...group 的功能已被半官方半放弃。从那一刻起,他们一直只是为了向后兼容而进行标记。我不知道为什么它们仍未被正式弃用。

您想将字符串转换为整数 - 使用并记住通过分析和/或返回值strtol来检查错误。errono而且,正如已经建议的那样,如果您将结果值用作数组索引,那么确保索引在适当的范围。

于 2016-03-22T17:40:43.130 回答
1

它警告您稍后在代码中使用受污染的值来访问数组。在这里查看如何修复它。

https://developer.klocwork.com/documentation/en/insight/10-1/sv-tainted-call-indexaccess

您获得的任何输入都需要在使用前以某种方式进行验证。

于 2016-03-22T17:38:25.007 回答
1

atoi定义为:

int atoi (const char *nPtr)                 /*convert the string nPtr to int*/

您必须记住,如果转换后的值不能表示为 int。atoi函数行为将未定义谨慎使用)。

更新

如果转换后的值超出相应返回类型的范围,则返回值未定义。如果无法进行转换,则返回​0​。

于 2016-03-23T02:34:39.300 回答