moevm / oclint_extensions

2 stars 1 forks source link

Критерий -- поиск `goto` (часть 1) #18

Closed mirrin00 closed 3 months ago

mirrin00 commented 9 months ago

goto -- в общем случае плохо и используется не по назначению. Нужно кидать предупреждение при использовании goto

Пример плохо кода:

int do_smth_cool(int x){
    int val = some_func(x);
    if(val > 0) goto label;
    x /= 2;
label:
    return x + val;
}

Как должно быть:

int do_smth_cool(int x){
    int val = some_func(x);
    if(val <= 0){
        x /= 2;
    }
    return x + val;
}
mirrin00 commented 9 months ago

Надо бы проверить, что данной проверки ещё нет в oclint

jcdkiki commented 9 months ago

Такая проверка действительно уже есть в OCLint.

jcdkiki@pc:~/code/oclint_extensions/examples$ ./test-gcc.sh ex-goto

OCLint Report

Summary: TotalFiles=1 FilesWithViolations=1 P1=0 P2=0 P3=2

/home/jcdkiki/code/oclint_extensions/examples/ex-goto/main.cpp:9:14: goto statement [basic|P3]
/home/jcdkiki/code/oclint_extensions/examples/ex-goto/main.cpp:6:2: short variable name [naming|P3] Length of variable name `x` is 1, which is shorter than the threshold of 3

[OCLint (https://oclint.org) v22.02]

ex-goto/main.cpp:

#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;

    if (x != 2) goto failed;
    cout << "Congrats! You typed 2!" << endl;

failed:
    return 0;
}

Критерий называется GotoStatmentRule.