2016-03-22 2 views
1

Для следующего кода, передает Klocwork непроверенные целое значение «Val» принимается от «atoi» и может быть использован, чтобы получить доступ к массивунепроверенные целое значение принимается от «atoi»

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?

+3

Вы используете 'val' в качестве индекса массива где-нибудь? ('xy [val]') – alain

+0

Что вы делаете с 'val'? –

+0

Да. Я использую val как индекс массива в другом фрагменте кода – impulse

ответ

5

Ну, первый очевидный совет здесь: прекратите использование atoi. atoi предназначен для эскизов, а не для реального кода. atoi не имеет механизмов сбоя обратной связи и создает неопределенное поведение при переполнении. Функции от ato... группы были полу-официально заброшены на C95. С этого момента они просто помечаются только для обратной совместимости. Я понятия не имею, почему они до сих пор официально не устарели.

Вы хотите преобразовать строку в целое число - используйте strtol и не забудьте проверить наличие ошибок, проанализировав errono и/или возвращаемое значение. И, как уже было предложено, если вы используете результирующее значение как индекс массива, это хорошая идея (и для ценности, исходящей из внешнего мира - это обязательно), чтобы убедиться, что индекс находится в правильный диапазон.

+0

Есть ли какой-либо официальный документ, подтверждающий ваше утверждение о необходимости использования 'ato *' группы функций? Я немного удивлен этим. –

+1

@ Rafael Campos Nunes: На самом деле это известный факт из истории языка C. В 1995 году язык C был обновлен с поддержкой широких символов. Все функции библиотеки, связанные с символами, получили свои широкие версии (например, 'wcscpy' для' strcpy', 'wcstod' для' strtod' и т. Д.). Однако никакой широкой версии функций из группы «ato ...» не было создано, потому что в то время они уже считались включенными функциями «strto ...». Вы можете прочитать об этом в довольно известном документе «C99 Обоснование»: http: //www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf (см. 7.20.1.1) – AnT

+0

Благодарим вас за информацию @AnT. –

1

Это предупреждение о том, что вы используете испорченное значение для доступа к массиву позже в своем коде. Посмотрите здесь, как это исправить.

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

Любой вклад, который вы получаете должно быть подтверждено каким-то образом перед использованием.

1

atoi это определяют как:

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

Вы должны иметь в виду, что если преобразованное значение не может быть представлено в междунар. atoi Поведение функции будет undefinned (используйте его с предосторожностью).

Обновлено

Если преобразованное значение выпадает из диапазона соответствующего возвращаемого типа, возвращаемое значение не определено. Если преобразование не может быть выполнено, возвращается 0.