Pull to refresh

Comments 33

Что-то я не понял, а с какого перепугу LeaveCriticalSection внезапно стала затирать чужие локальные переменные? Кажется, что ошибка всё же в ней тоже есть.

Она затирает переменные на стеке (локальные), время жизни которых уже закончилось. Просто так совпадало, что новые локльные переменные оказывались на том же месте, что и при предыдущем вызове sscanf().

Если точнее - она не затирает никакие переменные. Она легитимно использует пустое место на стеке для своих переменных. Это как раз функция LoadVehicleObject, зарезервировав место на стеке, читает оттуда значения которые никто туда не записывал - вполне логично что читается всякая хрень. Но раньше везло - данные сохранялись с предидущего вызова этой функции.
Совпадения никакого нет - поскольку функция вызывается в цикле - вполне логично, что позиция стека на последующих итерациях будет такой же, как и на предидущих.

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

Зачем? Оно же 20 лет работало.

Скрытый текст

сарказм

Дочитав весь рассказ, почему-то сразу вспомнилось: "страшно... Очень страшно, мы не знаем, что с этим делать... Если бы мы знали, что с этим делать... Но мы не знаем, что с этим делать..." :)))

Учитывая что большинство ПО на ПК не лучше написано и оттестировано... конечно страшно!

Нет, мы уволили QA и у нас теперь нет багов!

Тоже вариант!

И что-то мне подсказывает, не такой уж и фантастичный😁

Напомнило байку, где новый директор уволил весь IT отдел, но оставил только отдел продаж потому что продажники прибыль приносят, а от айтишников одни убытки. Можно было бы посмеяться, но несколько лет назад я сам оказался в похожей ситуации. Новая директор соптимизировала расходы, уволив почти всех мидлов и сеньоров (оставив по одному на проект) и заменив их студентами.

Рассказ кажется незавершенным.

Кажется кроме этого челика никто не сможет решить проблему , что у меня AS odyssey запускается от 6 до 11минут. Писал и на форуме и напрямую разрабам никто не знает. А в интернете пару таких же человек.

Пробовал и разные windows 10,11. И пиратку скряком и steam, и ыайоволлм блокировать исходящие соединения, и ставить рядом с виндой на диск С.

Предположительно какая то мега не совместимость загрузчика и intel ultra 100 серии , других объяснений нету.

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

что-то мне подсказывает лучше использовать кватернионы даже тут, угол лопастей искать не надо он всегда известен(мы в игре, угол модельки тоже известен направление тоже известно). Может даже лопасти-партиклы не плохо бы было наверно

А в WinRT версии баг воспроизводится? Если не воспроизводится, то просто играем в неё 👍

(Но там другие проблемы есть)0)

Не могу не поделиться радостной новостью про GTA: создатели GTA решили выпустить римейк GTA 2, который был киберпанком.

Просто офигенно! Какой сюжет и как раскрыт, автору оригинала огромное спасибо!
Сначала прочитал эту новость на 3DNews но там как обычно ученый изнасиловал журналиста.

Когда то сам напоролся на похожее, после смены компилятора msvc с одной версии на другую, а софте начались странные глюки, которые на уровне c++ и отладчика выглядели как полнейшая дичь. Только детальное изучение машинного кода помогло понять, что поменялся порядок передачи параметров. Микрософт молодцы для для какой то декларации вызовов взяли и изменили порядок с прямого на обратный, нахрена вопрос к ним, но при сборке с библиотеками собранными предидущими версиями компилятора начиналась чахарда.

А разве это не может ломать старые программы, где стек итак уже был близок к пределу?

Так система не перетирает актуальный стек, там легальное поведение. Просто одна из процедур ядра стала класть в стек на 4 байта больше (int32), чем модифицировала в памяти значение, которое будет (грубо говоря) прочитано из неинициализированной переменной (на самом деле — из ячейки памяти, в которую перед чтением sscanf ничего не положит).

Я просто не до конца согласен с выводом автора, да это баг игры, но тут есть и вина майков.

Их операционка должна так сказать перенимать идею x86 архитектуры в плане совместимости, а не заниматься ломающими мелочными обновлениями. Я почти уверен что там бесполезная и никому не нужная копи паста увеличившая Critical Section Object на 4 байта, которая теоретически может вызвать переполнение стека.

То есть причиной бага гта СА был не майкрософт, но причиной потери совместимости именно они, в чем смысл опускать этот факт делая вывод?

вообще мне кажется если после слов "Надо чётко сказать следующее: " написать любую информацию, то она будет звучать твердо и четко

Там нет переполнения стека, скорее всего они просто добавили в функцию одну новую переменную. В плане совместимости игра в целом работает, и в этом они контрактов не нарушили.

Не, я не про переполнение стека в гта са, в целом теоретически возможном плане

Так а как выполнение контрактов связано с работой софта? Меня как пользователя не интересует выполнение контрактов, а интересует работа софта. У меня если софт работать не будет я что пойду к адвокату узнавать, а легально ли он Не работает? Я просто пойду гуглить как заставить его работать очевидно

Или я упускаю важности контрактов в контексте не работы софта, не спроста она же жирным выделена?
По ощущениям это просто интересная информация, но зачем ее выделять

В «теоретически возможном плане» возможно всё, но изменение в ядре никакого переполнения стека не произведёт. Там выделение одной лишней переменной. До переполнения там очень сильно далеко. Фраза про «очень близко к этому» не означает «близко к исчерпанию стека». Более того, выделенный участок стека освобождается при выходе из функции, поэтому на некие программы, использующие стек по максимуму, это тоже не повлияет. Но выделять много памяти на стеке и рассчитывать на это — тоже неправильно, если только речь не про прошивку микроконтроллера, которая самостоятельно распоряжается всей доступной памятью.

Так а как выполнение контрактов связано с работой софта?

Речь о контрактах в программировании, это не про юридические контракты, а про API, ABI и документированность поведения. Изменение не портит аллоцированную память, а то, что игра пытается интерпретировать значения из неинициализированной памяти, так это неопределённое поведение, и любой студент-айтишник скажет, что так нельзя. Здесь полностью вина Rockstar, что они аллоцировали память, не проинициализировали её дефолтными значениями, а также проигнорировали возвращаемое функцией sscanf количество проинициализированных переменных.

Или я упускаю важности контрактов в контексте не работы софта, не спроста она же жирным выделена?

Нет, речь идёт о том, что внутренние функции Windows вправе использовать неаллоцированную память как посчитают нужным, а программисты не вправе рассчитывать на те значения, которые будут лежать в аллоцированной ими, но непроинициализированной памяти. Это и есть контракт.

Грубая аналогия произошедшего такая: идёт урок в классе, преподаватель пишет что-то на доске. Затем урок заканчивается, и все уходят (память освобождена). На следующий день преподаватель и студенты возвращаются (снова аллоцировали память), но они не вправе считать, что всё ранее записанное на доске, сохранится как было. Может быть занятий в аудитории не было или были, но на доске ничего не писали, или писали только на части доски. Соответственно, они не должны продолжать работать с тем, что там уже записано (неопределённое поведение), а следует стереть всё с доски и записать заново (проинициализировать память).

Аналогию с доской откуда-то взяли или сейчас придумали? Разрешите украсть, если придётся объяснять подобную проблему?

Придумал в ходе написания комментария. Конечно забирайте, по-моему, очень удачно получилось.

Вот она суть новаторских решений.

Помнится раньше юмор был с выходом процессоров дурон от амд. Вроде бы все быстро работало но частенько функции попросту игнорировались os windows. Мы шутили о о электронных на шине 200 как о гоночных болидах вылетающих за трек на крутых поворотах дорожек на печатных платах.

Майки могут увидеть этот новый баг и добавить новый хак в свои новые ОС - игра-то всё ещё популярная.

Отличная статья, было очень интересно почитать.

Ого, свежие комментарии , наконец то есть шанс найти тех, кто мне сможет помочь. Как интересно, но непонятно человеку не разбирающийся в кодировании😅

Но я по другому вопросу. Ребята, хочу добавить новый авто на новый ид без замены, но я сколько раз пытался - проблемы разные, машина либо не спавнится, хотя везде прописываю, либо игру крашит. Можете перекинуть меня на нужную тему где очень подробно рассказывают как и что или связаться с опытным человеком, который это проделывал много раз и он сможет мне помочь, чтобы я смог помогать другим? Никак не могу связаться с какими нибудь программистами, чтобы они мне скинули и объяснили по полочкам, чтобы у меня всегда получалось и смог распространить свои знания на других людей кто также не может сделать

Никто такого ещё не делал и сайты с мододелами для этой серии игр не помогают?

Sign up to leave a comment.

Articles