# V656. Variables are initialized through the call to the same function. It's probably an error or un-optimized code.

Анализатор обнаружил потенциальную ошибку, найдя в коде инициализацию двух различных переменных одинаковыми выражениями. Анализатор считает опасными не все выражения, а только в которых используется вызов функций.

Рассмотрим наиболее простой случай:

    x = X();
    y = X();

Возможны три варианта действий:

1) Код содержит ошибку. Необходимо исправить ошибку, заменив 'X()' на 'Y()'.

2) Код верен, но работает медленно. Если функция 'X()' требует много вычислений, то лучше написать 'y = x;'.

3) Код верен и работает быстро. Или функция 'X()' читает значение из файла. Тогда чтобы избавиться от ложного срабатывания, можно использовать комментарий "//-V654".

Теперь рассмотрим реальный пример:

    while (....)
    {
      if ( strstr( token, "playerscale" ) )
      {
        token = CommaParse( &text_p );
        skin->scale[0] = atof( token );
        skin->scale[1] = atof( token );
        continue;
      }
    }

В данном коде нет ошибки. Однако код не оптимален. Его можно переписать таким образом, что бы исключить лишний вызов функции 'atof'. Учитывая то, что присваивание находится в цикле и может быть вызвано много раз, такое изменение может привести к заметному выигрышу в быстродействии функции. Исправленный вариант кода:

    while (....)
    {
      if ( strstr( token, "playerscale" ) )
      {
        token = CommaParse( &text_p );
        skin->scale[1] = skin->scale[0] = atof( token );
        continue;
      }
    }

Рассмотрим ещё один пример:

    String path, name;
    SplitFilename(strSavePath, &path, &name, NULL);
    CString spath(path.c_str());
    CString sname(path.c_str());

В данном примере присутствует явная ошибка. Переменная 'path' используется два раза: для инициализации переменных 'spath' и 'sname'. Однако, по логике программы видно, что для инициализации переменной 'sname' должна быть использована переменная 'name'. Исправленный вариант кода:

    ....
    CString spath(path.c_str());
    CString sname(name.c_str());

Данная диагностика классифицируется как:

CWE-665

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V656.