170 похожих чатов

Это с cpprefference паста. Получается, что по стандарту UB, но

многие реализации позволяют использовать std::less для сравнения указателей?

17 ответов

34 просмотра

Даже лучше. Как уже написал, для встроенных операторов в отношении указателей сравнения гарантируют только partial-order, однако имплементации обязаны поддерживать некоторый согласованный с таким порядком неуточняемый total-order, который используется для библиотечных компараторов. Нужно для надежной ассоциативности в ситуациях, где указатели являются ключами ordered-контейнеров.

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

Стикер

Ilya Zviagin
Да и если без формальностей вдуматься в суть того,...

Почему ересь? Если это внешние символы линковщика все там правильно. вопрос что и как он их разместил, и выровнял. линковщик вам дает символ (не переменную) взяв адрес которого вы получите адрес расположения этого символа.

Stas Koynov
Почему ересь? Если это внешние символы линковщика ...

Писать между объектами это UB. То есть, ересь.

Ilya Zviagin
Писать между объектами это UB. То есть, ересь.

Это не обьекты это просто память, нет там обьектов. А то что в ++ сейчас все UB ну так чтож не программировать микроконтроллеры на нем? рано или поздно допилят, а если нет, то да после каждой генерацией идти и проверять асм, что он там придумал.

Stas Koynov
Это не обьекты это просто память, нет там обьектов...

Это означает, что вам нужен memset с О0, например, в отдельном файле. Или асм, как это сделано во многих embedded startup-файлах

Ilya Zviagin
Тоже нельзя. Тоже UB.

Норм компиляторы типа gcc это разрешают. вот взять 12.3 прекрасно можно занулить секцию bss: /* Uninitialized data section */ .bss : { . = ALIGN(4); __bss_start = .; *(.bss*) *(COMMON) . = ALIGN(4); __bss_end = .; } > RAM_D2 extern uint32_t __bss_start, __bss_end, inline void __init_bss(uint32_t *bss_start, uint32_t *bss_stop) { while(bss_start != bss_stop) *bss_start++ = 0; } __init_bss(&__bss_start, &__bss_end); //zero fill bss section(zero vars) __libc_init_array(); //call static constructors

Stas Koynov
Норм компиляторы типа gcc это разрешают. вот взять...

реализация компилятора и стандарт 2 разные вещи

Aniki Hi$ok@ 🌈 Z 🐀
реализация компилятора и стандарт 2 разные вещи

Важнее вопрос наличия (или отсутствия) гарантий, на которые можно было бы положиться - хоть стандартных, хоть имплементационных. Либо да, post-build верификаторами какими-то пользоваться на те участки, по которым гарантий не было (при условии, что их вообще можно локализовать).

Aniki Hi$ok@ 🌈 Z 🐀
реализация компилятора и стандарт 2 разные вещи

Я еще раз повторю, взрослые компиляторы на которых пишут ОСи и т.п это жрет, а то что это УБ ибо там нет обьектов, и ой эта сырая память, и бла бла бла... я не хочу эту тему поднимать и холиварить. вопрос был топикстартера не про это. У него не работает либо ошибка в выравнивании или еще чего вылезло.

Пишите ld файл правильно, а не как хочет левая нога.

Stas Koynov
Пишите ld файл правильно, а не как хочет левая ног...

Ага, ну то есть мы уже выходим за рамки C++. Сам по себе напрашивается вопрос, почему бы не написать этот код на ассемблере

артем λ
Ага, ну то есть мы уже выходим за рамки C++. Сам п...

Зачем вам ++, пишите весь код на асме, ломает меня писать даже мемкопи на асме, от слов совсем

Stas Koynov
Зачем вам ++, пишите весь код на асме, ломает меня...

Вы сейчас передёргиваете. Язык предоставляет абстракции, и порой они не вписываются в устройство конкретного исполнителя. Такова уж цена

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
Карта сайта