Предупреждение C26451: арифметическое переполнение - PullRequest
3 голосов
/ 05 мая 2019

Как мне решить эти предупреждения?

// midiNote is a double as it is used in floating point equation
// v is int because that's informative that the function wants whole numbers
void setMidiNote(int v) { midiNote = v-48;  }

Предупреждение C26451 Арифметическое переполнение: использование оператора '-' для 4-байтового значения и затем приведение результата к 8-байтовому значению.Приведите значение к более широкому типу перед вызовом оператора '-', чтобы избежать переполнения (io.2).

// input should be 0 to 10 integer, and dank will be odd integers only
// dank is a double, it is ultimately used in a floating point equation
void setDarkIntensity(int v) { dank = v * 2 + 1; }

Предупреждение C26451 Арифметическое переполнение: использование оператора '*' для 4-байтового значения и затем приведениерезультат до 8-байтового значения.Приведите значение к более широкому типу перед вызовом оператора '*', чтобы избежать переполнения (io.2).

Предупреждение C26451 Арифметическое переполнение: использование оператора '+' для 4-байтового значения и затем приведение результата к8-байтовое значение.Приведите значение к более широкому типу перед вызовом оператора '+', чтобы избежать переполнения (io.2).

Ответы [ 2 ]

3 голосов
/ 05 мая 2019

Я считаю, что это ошибка в VS2019

Например, это выдает предупреждение

double test2(int n)
{
     return 4.0 * (n - 1);
}

Но это не

int test2a(int n)
{
    return 4 * (n - 1);
}

Тем не менее, рискнеопределенного поведения гораздо больше для последнего.Умножение на 4 значительно увеличивает риск UB, так как гораздо больший набор n произведет UB

Возможно, для предупреждения, которое будет установлено, что высокий практически любой арифметической операции над целыми числами будет предупрежден.

Этот ответ показывает способ отключения этого предупреждения в VS 2019 в редакторе набора правил анализа кода.

Предупреждение C26454: арифметическое переполнение: операция '-' приводит к отрицательному результату без знака во время компиляции (io0,5)

3 голосов
/ 05 мая 2019

Предупреждения говорят о том, что существует вероятность того, что ваши вычисления переполнят исходный (меньший) тип до преобразования в результирующий (больший) тип.В первом случае, если v равно MIN_INT (-2 31 ), вычитание будет недооценено, что приведет к неопределенному поведению (вероятно, большому положительному числу), которое затем будет сохранено в midiNote.Чтобы избежать предупреждения, сначала преобразуйте в больший тип:

midiNote = double(v) - 48;

Аналогично для вашего второго примера.

Хотя вы можете знать, что setMidiNote не будет вызываться со значениями, которые будут иметьЭта проблема, компилятор не знает и выдает это предупреждение, чтобы предупредить вас о возможности возникновения проблемы.

...