Как подавить анализ кода C26454, извлеченный из CommCtrl.h? - PullRequest
2 голосов
/ 25 января 2020

Я реализовал виртуальный элемент управления List View. Для этого мне нужно обработать уведомление LVN_GETDISPINFO . Я сделал это так, как всегда делал в прошлом:

    case WM_NOTIFY: {
        auto const& nmhdr { *reinterpret_cast<NMHDR const*>(lParam) };
        if (nmhdr.idFrom == IDC_MY_LIST_VIEW && nmhdr.code == LVN_GETDISPINFOW)
        {
            // ...

Единственное, что изменилось, это то, что я сейчас использую Visual Studio 2019. И индикатору работоспособности документа не нравится, как определяется LVN_GETDISPINFOW. Это макрос препроцессора (LVN_FIRST-77) с LVN_FIRST, равным (0U-100U). Это вызывает C26454 :

Arithmeti c переполнение: операция «% operator%» выдает отрицательный результат без знака во время компиляции

Предупреждение очень ценится, но только когда он выходит из заголовочных файлов, я не контролирую их. Я могу отключить предупреждение, поместив уязвимый код в директиву pragma warning(disable:26454) (правильно восстановив предыдущее состояние сразу после него). Это макрос, однако мне нужно сделать это в моем коде, везде Я использую любую из этих констант.

Это работает, конечно. Но это утомительно. Есть ли способ подавить это предупреждение для всех констант, определенных в CommCtrl.h, не влияя на проверку другого кода?

1 Ответ

1 голос
/ 27 января 2020

Следующий код решает эту проблему для меня с VS2019. Вы можете попробовать:

case WM_NOTIFY: {
    auto const& nmhdr{ *reinterpret_cast<NMHDR const*>(lParam) };
    switch (nmhdr.code)
    {
    case LVN_GETDISPINFOW:
        if (nmhdr.idFrom == IDC_MY_LIST_VIEW)
        {
        }
        break;
    default:
        break;
    }
}

См. " LVN_GETDISPINFO код уведомления ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...