memset был "оптимизирован" - зануления не произошло...
Гарантируется, но про memset ты гонишь
Пароли memset-ом зануляешь? :)
memset можешь соптимизироваться, если после этого память не трогают
Увы, не гоню Ассемблерный выхлоп сейчас гляну, но факт в том, что в участок, ожидающий занулённую память, она не пришла таковой
Есть версия мемсета с гарантированным занулением (внутри просто через volatile зануляет в цикле)
Баг оптимизатора? MRE есть?
Не вышло посмотреть. Впервые вижу, как IDA падает с 0xC0000005 (access violation) при попытке открыть PDB...
Таки гнал, правда... Обнаружилась ошибка, пролежавшая незамеченной месяца три точно - зануляться должен был блок из header_size + bytes_count байт, но учитывалось только последнее значение (а зануление шло с начала блока) Итог - alignof(Ty) байт в конце не занулялись
Мне кажется надо сразу было искать ошибку. Если memset не зануляет, то нахрен он нужен? Что он тогда делает? Ни одна самая дикая оптимизация не должна изменить самой сути работы функции. А если такое есть, то это не оптимизация. Это вредительство.
Такая оптимизация есть... Неслучайно пароли никто не зануляет memset`ом)
Если участок памяти больше нигде не используется — зачем тратить ресурсы на его зануление?
Подробнее? Я пропустил, в смысле с мемсетом что то не так?
Какие люди!) Например, тут описано: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtlsecurezeromemory RtlZeroMemory - простой вызов memcpy И в гугле подобное найти можно...
А то что компилятор может заменить беск. цикл на return false тебя не смущает? Или якобы конечный цикл (полагаемся на переполнение знакового) на бесконечный? Правило "что вижу то и делает" в С++ не работают.
Гарантируется. Где ты там ловил memset не понятно совсем. С чего ты взял что он должен вызываться?
Ассемблерный выхлоп никогда ничего не доказывает
А если объявить эту переменную как volatile?
Это как ты представляешь?
А вы знаете что такое volatile?
Да даже если б это помогло - КАК ? Тут нет переменной, она динамическая
Напиши кусочек кода как это ты предполагаешь сделать
можно пруф
Про замену бесконечного на return false смущает. Ведь проги для микроконтроллеров так и пишут: там бесконечный цикл, в котором и прописана вся основная работа железки. Про замену конечного цикла с переполнением знакого не смущает. Переполнение знакового - это уб, поэтому ожидаемо непонятый результат.
У @DymOK, как я понял, участок памяти использовался. Если функция написана правильно, без уб, (а memset, очевидно, написан без уб), то ее правильный вызов должен привести к тому, что в функции заложено. И никакая оптимизация не должна менять этого. И если ты видишь, что как будто оптимизация что-то поменяла в поведении, то надо искать ошибку в своем коде, а не в оптимизаторе или в стандартной функции. А иначе как писать программы то тогда?
На мк чтение/запись в volatile переменные, выведенные в порты, не дает выкинуть цикл
Ну значит это был баг
Обсуждают сегодня