对于以下代码,klocwork报告从'atoi'收到未经验证的整数值'val',可用于访问数组
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在这里期待什么?
答案 0 :(得分:6)
嗯,这里第一个明显的建议是:停止使用atoi
。 atoi
用于草绘,而不是用于实际代码。 atoi
没有任何故障反馈机制,并在溢出时产生未定义的行为。来自ato...
组的职能在C95中被半正式半遗弃。从那时起,他们只是为了向后兼容而进行标记。我不知道他们为什么还没有被正式弃用。
您希望将字符串转换为整数 - 使用strtol
并记住通过分析errono
和/或返回值来检查错误。并且,正如已经建议的那样,如果您将结果值用作数组索引,那么确保索引位于以下是一个好主意(并且对于来自外部世界的值 - 这是必须的)适当的范围。
答案 1 :(得分:1)
它警告您,您在代码中稍后使用受污染的值来访问数组。看看如何解决它。
https://developer.klocwork.com/documentation/en/insight/10-1/sv-tainted-call-indexaccess
您获得的任何输入都需要在使用前以某种方式进行验证。
答案 2 :(得分:1)
atoi 定义为:
int atoi (const char *nPtr) /*convert the string nPtr to int*/
您必须记住,如果转换后的值无法表示为int。 atoi 功能行为将未确定(谨慎使用)。
<强>更新强>
如果转换后的值超出相应返回类型的范围,则返回值未定义。如果不能执行转换,则返回0。