Предупреждение C26454: Арифметическое переполнение: операция ‘-‘ дает отрицательный результат без знака во время компиляции (io.5)

Анализ кода:

ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_HISTORY_TYPE,
&CAssignHistoryDlg::OnTcnSelchangeTabHistoryType)

Предупреждение C26454:

Арифметическое переполнение: операция ‘-‘ дает отрицательный результат без знака
во время компиляции (Io.5).

Определение TCN_SELCHANGE является:

#define TCN_FIRST (0U-550U)
#define TCN_SELCHANGE           (TCN_FIRST - 1)

Я не вижу, что еще я могу сделать!

1

Решение

Вы пытаетесь вычесть большее беззнаковое значение из меньшего беззнакового значения, и это приводит к тому, что результат переносится за ноль. В вашем случае я предполагаю, что TCN_FIRST определен как 0, так что установка TCN_SELCHANGE в единицу решит проблему.

Вы также должны использовать constexpr или же const а не определяет в любом случае.

По данным MSDN:

Арифметические проверки переполнения в C ++ Core Check

C26451 RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE : Оператор [operator] переносит 0 и выдает большое число без знака во время компиляции. Это предупреждение указывает, что операция вычитания дает отрицательный результат, который был оценен в контексте без знака. Это приводит к тому, что результат переносится за 0 и выдает действительно большое число без знака, что может привести к непреднамеренным переполнениям.

1 // Example source:
2 unsigned int negativeunsigned() {
3    const unsigned int x = 1u - 2u; // C26454 reported here
4    return x;
5 }

1 // Corrected source:
2 unsigned int negativeunsigned() {
3     const unsigned int x = 4294967295; // OK
4     return x;
5 }

В исправленном источнике положительное значение было присвоено неподписанному результату.

1

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

//windows header file:
#define TCN_FIRST (0U-550U)
#define TCN_SELCHANGE           (TCN_FIRST - 1)

//user file:
...
unsigned int i = TCN_SELCHANGE;

Выше код действителен в C ++, он должен компилироваться без предупреждения. Там нет переполнения, это просто должно быть -550U Было бы более понятно, если бы они написали это как #define TCN_FIRST 0xFFFFFDDA или же 0xFFFFFFFFU-549U

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

Возможное решение:

Отключите предупреждение в коде:

#pragma warning( push )
#pragma warning( disable : 26454 )

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTabHistoryType)
END_MESSAGE_MAP()

#pragma warning( pop )

Или отключите предупреждение в правиле анализа кода
Используйте редактор набора правил анализа кода

введите описание изображения здесь

1

По вопросам рекламы [email protected]