Предупреждение 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 шт):
Возможно потому, что сумма (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
Вам же компилятор сказал где ошибка! Арифметическое переполнение это неопределенное поведение. Используйте более широкие типы для исправления.