сложные ситуации с cppcheck - PullRequest
       6

сложные ситуации с cppcheck

0 голосов
/ 03 января 2019

Я сталкиваюсь с ситуацией, когда мне нужно пройти cppchecks, но иногда это бывает сложно.Что вы обычно делаете в таких обстоятельствах?Например.

#include<iostream>
using namespace std;
void fun1();
int fun2();
int main()
{
        fun1();
}

void fun1()
{
        int retVal;
        if (-1 == (retVal = fun2()))
        {
                cout <<"Failure. fun2 returned a -1"<< endl;
        }
}

int fun2()
{
        return -1;
}

Обычно мы видим код, подобный приведенному выше.cppcheck для вышеуказанного файла выдаст следующий вывод: *

cppcheck --suppress = redundantAssignment --enable = 'предупреждение, стиль, производительность, переносимость' --inline-suppr --language = 'c ++ 'retval_neverused.cpp Проверка retval_neverused.cpp ... [retval_neverused.cpp: 13]: (стиль) Переменной' retVal 'присваивается значение, которое никогда не используется.

Я не хочудобавить некоторую фиктивную ретрансляцию печати только ради cppcheck.Фактически, это может быть ситуация, когда я выбрасываю исключение, и я не хочу, чтобы в исключении было что-то тривиальное в качестве значения retVal.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы можете переписать как:

const int retval = fun2();
if (retval == -1)

Эту технику, IMHO, легче отлаживать, поскольку с помощью отладчика вы можете увидеть значение, возвращаемое из fun2 до выполнения оператора if.

Отладка с помощью вызова функции в выражении if немного сложнее увидеть возвращаемое значение из функции.

0 голосов
/ 04 января 2019

Один из распространенных способов - что-то вроде этого:

#define OK_UNUSED(x) (void)x


void fun1()
{
        int retVal;
        if (-1 == (retVal = fun2()))
        {
                OK_UNUSED (retVal);
                cout <<"Failure. fun2 returned a -1"<< endl;
        }
}

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

Обратите внимание, что этот макрос не должен использоваться, если оценка его параметра имеет последствия. В этом случае вам нужно что-то более изобразительное:

#define OK_UNUSED(x) if(false && (x)) ; else (void) 0
0 голосов
/ 03 января 2019

CppCheck вроде как правильно, хотя.Вам не нужен ретваль вообще.просто проверьте возвращаемое значение fun2 напрямую: if( -1 == fun2() )

Кроме того, присваивание переменных внутри условных выражений действительно плохая практика.Намного сложнее поймать опечатки там, где вы хотели набрать ==, но на самом деле набрали =.

...