Вопрос Краш в функе

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
run-Time Check Failure #2 - Stack around the variable 'value' was corrupted.

во время вызова 26-й функи СЕнжинКлиент(это должно быть возвращать индекс локального игрока, но постоянно ошибка выскакивает, я нажимаю пропуск)

C++:
virtual WORD* func26(WORD* ret,int SplitScreenShot = 0) = 0; // GetLocalPlayer

int GetLocalPlayerIndex()
{
    if (!g_EngineClient)
    {
        return -1;
    }
    unsigned short int value = 0;
    g_EngineClient->func26(&value);
    return value + 1;
}
 
Участник
Статус
Онлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
330
Поинты[?]
62K
ну так подебажь нет???? в чём проблема.
а по факту - мб индекс не тот, мб тип не тот(ты даешь short*, т.е. указатель на два байта, а записывает может четыре байта допустим), мб вызываешь не так
1699799457968.png
чекни дизасм 26й функции там дворд а не ворд
суть ошибки - записывает в стек туда куда не надо(это либо связано с неправильным индексом/неправильным вызовом, либо с тем что твоя переменная value находится в стеке и имеет неправильный тип. отличить эти две разных причины можно легко и просто - value из стека в хип муваешь(short* p_value = malloc(2);) и тогда другая ошибка уже может быть/не быть. если осталась старая значит функу неправильно вызываешь(ну т.е. value не виноват т.к. он теперь не в стеке), если пропала/новая появилась то значит с value проблемы)
 
Участник
Статус
Онлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
330
Поинты[?]
62K
на код чтоб ты понимал суть ошибки
C++:
#include <cstdint>

int main()
{
    std::uint16_t test{};
    [](std::uint32_t& v) { v = 0xFFFFFFFF; }((std::uint32_t&)test);
    return 0;
}
передаешь в функцию указатель на два байта, а функция думает там 4 байта, перезаписывает все 4 байта(хотя там 2 байта было чужих). потом твоя же прога(изза настроек компилятора - дебаг режим) чекает(в целях безопасности) эти два байта перезаписаных и видит там хуйню. как оно это видит? оно изначально запихивает в стек кучу 0xCC(на скрине 0000 это переменная test)
1699817887206.png
если эти 0xCC перезаписаны(ну т.е. там чтото не равное 0xCC) то даст пизды.
решение, очевидно - не передавать указатель на 2 байта в функцию которая ожидает указатель на 4 байта
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
321
Реакции[?]
24
Поинты[?]
12K
Пожалуйста, авторизуйтесь для просмотра ссылки.
Спс но я бы не задавал вопрос,если бы не умел гуглить. А я хотел нормальный человеческий ответ.
ну так подебажь нет???? в чём проблема.
а по факту - мб индекс не тот, мб тип не тот(ты даешь short*, т.е. указатель на два байта, а записывает может четыре байта допустим), мб вызываешь не так
Посмотреть вложение 263738
чекни дизасм 26й функции там дворд а не ворд
суть ошибки - записывает в стек туда куда не надо(это либо связано с неправильным индексом/неправильным вызовом, либо с тем что твоя переменная value находится в стеке и имеет неправильный тип. отличить эти две разных причины можно легко и просто - value из стека в хип муваешь(short* p_value = malloc(2);) и тогда другая ошибка уже может быть/не быть. если осталась старая значит функу неправильно вызываешь(ну т.е. value не виноват т.к. он теперь не в стеке), если пропала/новая появилась то значит с value проблемы)
Да спс, действительно неправильный аргумент давал. ИДА снова подвела, писала что в аргументе WORD*, поэтому и вписал ворд. а дал сейчас uintptr_t* и воркает норм. Спс.
 
Участник
Статус
Онлайн
Регистрация
23 Май 2019
Сообщения
775
Реакции[?]
330
Поинты[?]
62K
Спс но я бы не задавал вопрос,если бы не умел гуглить. А я хотел нормальный человеческий ответ.

Да спс, действительно неправильный аргумент давал. ИДА снова подвела, писала что в аргументе WORD*, поэтому и вписал ворд. а дал сейчас uintptr_t* и воркает норм. Спс.
почему uintptr_t(8 байт на x64) я тебе скинул скриншот асма там конкретно dword(std::uint32_t, 4 байта). как ты юинтптр на -1 чекать собираешься(мало ли)? выбрасывать верхние 32 бита?)) тогда нахуй он тебе вообще нужен
 
эксперт в майнкрафт апи
Read Only
Статус
Оффлайн
Регистрация
25 Янв 2023
Сообщения
684
Реакции[?]
287
Поинты[?]
22K
Спс но я бы не задавал вопрос,если бы не умел гуглить. А я хотел нормальный человеческий ответ.

Да спс, действительно неправильный аргумент давал. ИДА снова подвела, писала что в аргументе WORD*, поэтому и вписал ворд. а дал сейчас uintptr_t* и воркает норм. Спс.
сначала немного не понял какого хуя у тебя вообще что то работает, а потом задумавшись вспомнил о неявном даункасте других функций которые хавают DWORD вместо QWORD.
вообщем да, хуйня, переделывай под __int32.
 
Последнее редактирование:
НЕКАСЕСТВЕНЫЙ КАД
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,430
Реакции[?]
252
Поинты[?]
4K
Спс но я бы не задавал вопрос,если бы не умел гуглить. А я хотел нормальный человеческий ответ.
дак там нормальный человеческий ответ вроде
стеку пизда если кратко
чел выше написал что надо сделать четко и понятно
 
Сверху Снизу