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

DWORD DecimalBaseAddr = GetModuleBase (gameName, pID);
cout << "The Base Address is: " << DecimalBaseAddr << "\n";
vector<DWORD> pointsOffsets{ 0x1700, 0x0, 0x10, 0x8, 0x988 };
DWORD WorldPtr = 0x258C9D0;
DWORD WorldAddr = NULL;
ReadProcessMemory(pHandle, (LPVOID)(DecimalBaseAddr+ WorldPtr), &WorldAddr, sizeof(WorldAddr), NULL);
cout << WorldAddr << "\n";
DWORD pointsAddr = WorldAddr;
for (int i = 0; i < pointsOffsets.size() - 1; i++) {
    ReadProcessMemory(pHandle, (LPVOID)(pointsAddr+ pointsOffsets.at(i)), &pointsAddr, sizeof(pointsAddr), NULL);
    cout << "Value at the offset is = " << hex << pointsAddr << "\n";
}
pointsAddr += pointsOffsets.at(pointsOffsets.size() - 1);

Не знаю где здесь моя ошибка, однако когда DecimalBaseAddr = e6910000, то при сложении в строке :

ReadProcessMemory(pHandle, (LPVOID)(DecimalBaseAddr+ WorldPtr), &WorldAddr, sizeof(WorldAddr), NULL);

cout выводит 0, и все последующие оффсеты (Я сейчас говорю про цикл ниже)

for (int i = 0; i < pointsOffsets.size() - 1; i++) {
    ReadProcessMemory(pHandle, (LPVOID)(pointsAddr+ pointsOffsets.at(i)), &pointsAddr, sizeof(pointsAddr), NULL);
    cout << "Value at the offset is = " << hex << pointsAddr << "\n";
}

Так вот весь цикл тоже выводит 0, плюс в обоих случаях висит предупреждение C26451. Я не знаю, как и что исправить, чтобы предупреждение исчезло, а операторы работали нормально.

!!! UPD !!! Ошибку с Арифметическим переполнением удалось решить, однако все остальные ReadProcessMemory() выводят 0. Посмотрел GetLastError() - выводит ошибку 12b, то есть ReadProcessMemory() выполняется не полностью, в чем может быть ошибка?


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

Автор решения: Aptem_f

Возможно потому, что сумма (DecimalBaseAddr+ WorldPtr) больше чем размер DWORD

DWORD - A 32-bit unsigned integer. The range is 0 through 4294967295 decimal.
This type is declared in IntSafe.h as follows:
typedef unsigned long DWORD;

(0xe6910000 => 3868262400 (10) ) + (258C9D0 => 39373264 (10)) получается болье размера DWORD

→ Ссылка
Автор решения: dIm0n

Вам же компилятор сказал где ошибка! Арифметическое переполнение это неопределенное поведение. Используйте более широкие типы для исправления.

→ Ссылка