Новые предупреждения c ++ повышают надежность? - PullRequest
0 голосов
/ 26 сентября 2019

Итак, я работал в C ++ после долгой работы в C #, и я заметил, что теперь есть все эти предупреждения.

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

Вот пример того, что мне не кажется полезным:

static TCHAR szGeneral[] = _T("General");
static TCHAR szSqlOdbcDriver[] = _T("SqlOdbcDriver");

WriteProfileString(szGeneral, szSqlOdbcDriver, CSqlServerDatabase::m_sOdbcDriver.GetString());

Предупреждение C26485 Выражение 'szGeneral': Нет массивак затуханию указателя (bounds.3).

Предупреждение C26485 Выражение 'szSqlOdbcDriver': нет массива для затухания указателя (bounds.3).

Мой вопрос: это делает мой код лучше?

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

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Обратите внимание, что это предупреждение исходит от средства проверки основных рекомендаций, недавно добавленного в Visual Studio.Предупреждения от этой проверки будут иметь смысл только тогда, когда вы пишете новый код с нуля и готовы следовать основным рекомендациям.В противном случае отключите средство проверки.

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

В свойствах вашего проекта у вас есть /analyze в C/C++-->Command Line.Вы должны избавиться от этого флага (я не знаю, как это сделать для вашей версии Visual Studio).

Не отключайте все предупреждения.

1 голос
/ 26 сентября 2019

ИМО это зависит от ситуации.Например, компилятор выдает предупреждение, потому что как только вы передаете char [] функции, вы теряете информацию о sizeof ().Однако это может даже не иметь значения, так как строки заканчиваются нулем.Но рассмотрим случай, когда как-то пропал nullptr.Тогда как бы вы вычислили его длину в функции?

Чтобы помочь компилятору в таких случаях, я бы рекомендовал явно сообщить компилятору, что вы знаете, что делаете.Это также делает намерение видимым.учтите -

long b = 50;
int a = b;

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

long b = 50;
int a = static_cast<int>(b);

дает понять, что он предназначен.

...