tag:blogger.com,1999:blog-1702873441071265539.post399302909058296865..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Добавление EurekaLog в программу вызывает Integer Overflow?GunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-1702873441071265539.post-25066253346051452072020-12-07T08:50:55.544+03:002020-12-07T08:50:55.544+03:00Да нет, упоминается:
>For the register and pasc...Да нет, упоминается:<br />>For the register and pascal conventions, the evaluation order is not defined.<br />Что-то такое же и для операндов в выражениях должно быть.<br />И вообще так в «древних» языках исторически общепринято сложилось, как часть негласного правила «всё, что не определено — неопределённо».<br /><br />В документации Free Pascal прямым текстом сказано, что <b>const</b> — это гарантия не от компилятора программисту, а от программиста компилятору, что переменная не изменится: https://www.freepascal.org/docs-html/ref/refsu66.html.<br /><br />As a side effect, the following code will produce not the expected output:<br />Var <br /> S : String = ’Something’; <br /> <br />Procedure DoIt(Const T : String); <br />begin <br /> S := ’Something else’; <br /> Writeln(T); <br />end;<br /><br />begin <br /> DoIt(S); <br />end.<br /><br />Will write<br />Something else<br /><br />This behavior is by design.<br /><br />Это нужно как раз затем, чтобы пропустить подсчёт ссылок при передаче <b>const</b>-аргументов. В свою очередь, о выражениях, типа a + b или [a, b, c], можно думать как об эквивалентных функциях add(const a, const b) или make_array(const a, const b, const c).Рика Ичиносеhttps://www.blogger.com/profile/08974961840717162086noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-1953215593092446882020-12-02T15:05:11.973+03:002020-12-02T15:05:11.973+03:00Вопрос интересный. С одной стороны - ваши аргумент...Вопрос интересный. С одной стороны - ваши аргументы, с другой стороны - <a href="https://www.transl-gunsmoker.ru/2011/05/basic-ground-rules-for-programming.html" rel="nofollow">контракт</a>: "Все параметры стабильны: вы не можете менять параметр, пока работает функция, в которую он передан". В данном случае "функция" - это вся строка целиком.<br /><br />Просто увеличение счётчика - это UStrLAsg / lock inc dword ptr [...]. Префикс lock означает блокировку шины и/или кэша процессора на время выполнения этой операции, это гарантирует, что текущий процессор/ядро будет иметь монопольный доступ к указанной памяти, и гарантирует порядок операций: результаты выполнения команды будут учитываться сразу (т.е. если в кэше было старое значение, оно не будет использовано). Короче говоря, это сильно не здорово для многопоточной производительности. И делать это N раз в одной стоке (на каждый аргумент), чтобы избежать сильно маловероятного сценария, который к тому же является скорее ошибкой программиста... В общем, можно понять, почему так не сделано.<br /><br />Но если хотите - попробуйте, создайте тикет на QC.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-54898101376390908172020-12-01T20:58:12.403+03:002020-12-01T20:58:12.403+03:00Если всё происходит так, как вы описали, то это яв...Если всё происходит так, как вы описали, то это явный баг компилятора. Я не видел в документации по конкатенации никаких предупреждений, что аргументы обязательно не должны иметь побочных эффектов.<br />В любом случае, правильно скомпилированная строка вида "Data := Data + Marker + ReadLine;" не должна вызывать подобных проблем, по той причине, что строки являются сущностями с подсчётом ссылок использования. Поэтому когда компилятор готовит строки перед вызовом _UStrCatN он должен у каждой этой строки увеличить счётчик ссылок, что гарантирует их неизменность, а после вызова _UStrCatN он должен отпустить эти строки уменьшив счётчик ссылок. Если же компилятор пытается обойти эту систему ссылок надеясь на "авось пройдёт", то вот и получаем такой неприятный баг...Валигозиhttps://www.blogger.com/profile/14701925611514925861noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-89332489008273762672020-11-26T01:15:35.289+03:002020-11-26T01:15:35.289+03:00У меня был похожий баг в коде вида
a[GetIndexInA(...У меня был похожий баг в коде вида<br /><br />a[GetIndexInA()] := value;<br /><br />где <i>a</i> — массив-поле класса, и <i>GetIndexInA</i> иногда его реаллоцирует. Больше так не выделываюсь. :(Рика Ичиносеhttps://www.blogger.com/profile/08974961840717162086noreply@blogger.com