Предупреждение C26451. Арифметическое переполнение

Столкнулся с предупреждением при попытке получить элемент вектора по индексу с использованием вычисляемого значения.

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

Пример кода, в котором наблюдается предупреждение:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a{0,1,2,3,4,5};
    int b = 0;
    std::cout << a[b + 1] << std::endl;  // подчеркивает 'b+1'
    return 0;
}

Почему возникает такое предупреждение?

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

Я бы понял это предупреждение тут:

unsigned char c = 24;
c += 250;

Но в данном примере IDE не видит проблемы.

В чем я заблуждаюсь с определением переполнения?

Также заметил, что изменение платформы в диспетчере конфигурации VS2019 с x64 на x86 приводит к исчезновению этого предупреждения.


Ответы (1 шт):

Автор решения: αλεχολυτ

В данном случае суть предупреждения в следующем: для индексации вектора на 64 битной платформе используется 64 битное беззнаковое целое, но выражение "b+1" имеет тип int. Если предположить, что в b будет максимальное значение, представимое типом int, то получим UB. Решение: привести хотя бы один из операндов к 64 битному типу.

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

→ Ссылка