Как написать «вложенный оператор if … else для констант» без предупреждений, в стандарте gnu 11?

#c #if-statement #code-analysis #static-code-analysis

#c #if-statement #анализ кода #статический анализ кода

Вопрос:

Когда я использую вложенный оператор if ….else с

 if (std::is_same<T, T1>::value) 
{
  // do something
} 
else if (std::is_same<T, T2>::value)
{
  // do something else
}
.
.
.
else
{
  // print error
}
  

Я получаю предупреждение компилятора QACPP static code analyzer qacpp-4.2.1-4090 с сообщением «Условие в этом операторе ‘if’ является постоянным». Как мне исправить это предупреждение компилятора в стандартах gnu 11?

ПРИМЕЧАНИЕ: Я не эксперт в C , поэтому, пожалуйста, извините меня, если вопрос звучит любительски.

Комментарии:

1. Отказаться от QACPP в пользу какого-либо другого инструмента?

2. Это функция? Как выглядит подпись?

3. Я немного изменил вопрос, если вы видите это сейчас, приведенные выше строки вызываются внутри конструктора шаблонного класса T и сравниваются с другими типами шаблонов T1, T2, чтобы присвоить определенное значение переменной-члену шаблонного класса T, на основе соответствующего условия if.

Ответ №1:

Для конкретного экземпляра T if условные обозначения являются постоянными. Другими словами std::is_same<T, int>::value amp; c. являются постоянными выражениями.

Но это вполне может быть необходимостью, если вы задали код таким совершенно законным способом. (Возможно, вы сможете выполнить рефакторинг для метода статического полиморфизма, используя специализацию шаблона, если важно избежать предупреждения статического анализатора.)

Кажется, что статический анализатор слишком усердствует по отношению ко мне.

Комментарии:

1. Будет ли по-другому, если я скажу, что фактический код не имеет if (std::is_same<T, int>::value) , но имеет if (std::is_same<T1, T2>::value) ? Однако I анализатор кода показывает предупреждение в обоих случаях.

2. Разницы нет. Это потому, что std::is_same<T1, T2>::value это всегда константное выражение, которое можно вычислить во время компиляции.

3. Да, я думаю, вы правы … значит, ничего нельзя сделать, чтобы исправить такие предупреждения? ПРИМЕЧАНИЕ: Я использую платформу PRQA Source Code Analyzer версии 3.0 93377.

4. @Rookie_Coder2318; Кроме изменения предупреждений или рефакторинга кода (чего я бы не стал делать на том основании, что это было бы несовершенным вилянием хвостом разумно закодированной собаки), нет. Статические анализаторы имеют свое место, но я не думаю, что цель состоит в том, чтобы устранить все предупреждения.

Ответ №2:

Инструмент кодирования буквально просит вас отказаться от хороших практик, таких как:

 if (static_condition) {
   // code that is effectively compiled out when static_condition is false
}
  

и вместо этого использовать что-то вроде:

 #if static_condition
   // code that is compiled out when static_condition is false
#endif
  

что даже невозможно сделать в конкретной ситуации, которая у вас там есть, и является неполноценной практикой.

Это не очень хорошая, продуктивная диагностика, за исключением случаев, когда static_condition она явно безусловна, например if (false) ... .

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

 // @foo-bar tool: disable-warning(13125)
if (static_condition) ...