Pc Lint, как подавить ошибку 613 (возможное использование нулевого ponter) для класса с init ()

Пытался максимально упростить ситуацию. Итак, у меня есть класс:

class C
{
int * field;
public:
C() : field(nullptr) {}
void init(int* f) { field = f; }

int getI1() { return *field; }
int getI2() { return *field; }
};

который генерирует 2 предупреждения Lint 613 (возможное использование нулевого указателя ‘C :: i’ …)

Я знаю, что «поле» не будет нулевым, когда вызываются getI1 () или getI2 (). И, к сожалению, я не могу инициализировать его в конструкторе. Поэтому я хочу подавить предупреждения Lint. Я могу сделать это так

class C
{
int * field;
public:
C() : field(nullptr) {}
void init(int* f) { field = f; }

int getI1() { return *field; } //lint !e613
int getI2() { return *field; } //lint !e613
};

но в моем реальном случае:

1) таких классов довольно много, и в каждом классе
функции, которые используют этот указатель.

2) Мои руководства не позволяют мне добавлять слишком много пуха
комментарии в коде.

Итак, мой вопрос: кто-нибудь знает параметр командной строки, который позволит мне сказать Lint: «Я знаю, что код не самый лучший, просто прекратите проверять эту конкретную переменную-член на нулевое значение»?

Может быть, что-то похожее на параметр -sem?

1

Решение

Итак, мой вопрос: кто-нибудь знает параметр командной строки, который позволит мне сказать Lint: «Я знаю, что код не самый лучший, просто прекратите проверять эту конкретную переменную-член на нулевое значение»?

Это неправильный способ справиться с этим (даже если бы я знал такой параметр командной строки).

PC-Lint предупреждает вас об этом правильно

int getI1() { return *i; } //lint !e613
int getI2() { return *i; } //lint !e613

может непреднамеренно разыменовать nullptr,

Просто пытаюсь подавить1 это ослабление не очень хорошая идея, так как зов init() функция не обязательна

Правильный способ избавиться от него — добавить явную проверку, например

int getI1() {
if(i) {
return *i;
}
throw std::runtime_error("i wasn't initialized properly.");
}

1) Таких классов довольно много, и у каждого класса есть много функций, которые используют этот указатель.

Нет другого пути, кроме как просто просмотреть их и реорганизовать этот плохой код.

2) Мои руководства не позволяют мне добавлять в код слишком много комментариев.

Это хорошая политика. Они потратили деньги на установку инструмента SCA по причинам, и хотят улучшить код.
Если это вступает в противоречие с временем, которое у вас есть, сделайте это, попросите их создать задачу, которая позволит вам это сделать.


Если вы просто хотите сосредоточиться на других (более важных вещах), о которых сообщает PC-Lint, используйте grep или аналогичные инструменты, чтобы отфильтровать то, что вы не хотите видеть банкоматом. Но не устанавливайте параметры командной строки, чтобы полностью их подавить. Это те вещи, которые будут навсегда забыты и никогда не будут затронуты или вновь достигнуты на более поздних этапах.


1
Подавление любых ошибок или предупреждений, выдаваемых инструментом SCA, таким как PC-Lint, сводит на нет всю его цель, если только вы не абсолютно уверены, что инструмент дает вам ложно положительный. В противном случае ваша компания может просто сэкономить деньги, потраченные на лицензии, и придерживаться плохих привычек кодирования.

0

Другие решения

Кажется, что после запуска конструктора у вас есть экземпляр, который нельзя использовать (произойдет сбой, если вы вызовете getT1 () или getT2 ()). Это совсем не то, что мне нравится.

Намного лучше иметь конструктор C (int * f). Проблема уходит. Это тот случай, когда предупреждение полностью оправдано и предупреждает вас о плохом коде, поэтому плохой код следует исправить.

0

Я знаю, что код плох, должен быть исправлен и так далее. К сожалению, я не могу сделать это прямо сейчас (из-за огромных усилий для одного человека и очень рискованных изменений), но эти ошибки подавляли другие, иногда более критические, проблемы

Я обнаружил, что для подавления этого предупреждения в одну строку вы можете сделать:

-esym(613, C::field)
0
По вопросам рекламы [email protected]