Предупреждение 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 битному типу.
Компилятор ругается здесь не на конкретные значения, а на типы, используемые в выражении.