All streams
Search
Write a publication
Pull to refresh
77
0
Send message

А что же все-таки делает std::launder?

Ну, я что вспомнил, то и написал. Суть везде одна и та же, что можно кастовать указатель только к определенным типам и обратно. Нельзя взять произвольный тип и к нему кастовать.
Эээ, но printf же вроде вообще не умеет float печатать, только double.

Извините, не понимаю вопрос. strict aliasing разрешает (если я правильно помню):


  • касты к char * и обратно
  • касты к void * и обратно
  • касты к signed/unsigned варианту текущего типа
  • касты к const варианту текущего типа и обратно

Вроде все. Все остальное — UB. Причем тут "на сколько байт"?

Я вам привел пример, при котором чтение по указателю может привести к ошибке. Создать указатель, с помощью которого вы сможете сделать такое невыравненное чтение, можно только нарушив strict aliasing.
Если его не нарушать, то и за выравниванием следить не придется.
Это да, но ваша статья-то про STM32; там эта функциональность вроде как присутствует.
Мне в комментарии советовали потрогать DebugMon, который, по идее, позволит отделить хардфолт от переполнения стека, но сходу у меня это не заработало и дальше я пока не копал.
Может у вас получится?
С большим — а насколько большим? 20 Кб? 40? Мегабайт? Если никак не профилировать и не оценивать потребление стека, то как узнать, сколько вам хватит? Или сразу Малину ставить предложите?
Это ваше мнение, основанное на личном опыте или результат какого-то исследования?
Впрочем, мысль, что большинство окружающих людей — зомби, особого отторжения у большинства людей и не вызывает :)
В романах Скотта Бэккера («Князь Пустоты» и т.д.) был относительно интересный момент, связанный с ф-зомби.
Спрячу под спойлер на всякий случай
Часть условно-отрицательных персонажей там — искуственно созданные существа, которые могут мимикрировать под других людей, но при этом утверждается, что у них или нет сознания, или оно не полностью идентично человеческому — в терминах мира книги у них нет «души». Не в точности философские зомби, но похоже. При этом, в обиходе, от людей они почти не отличимы, если отличия не выискивать специально.

– Нет, Сома. Не играй со мной в эти игры. Ты не можешь пропустить через себя ничто человеческое, потому что у тебя нет души. Ты не настоящий.
– Но я говорю. Как бы я мог говорить, не имея души?
– Попугаи тоже говорят. Ты просто очень способный попугай.
– Боюсь, что представляю из себя гораздо больше.
– Могу даже доказать это тебе.
– Сейчас?
<...>
– С тобой говорит человек, – начинает она с лукавой улыбкой. – Не верь ни единому моему слову, потому что я лгунья.
Она делает паузу, дожидаясь, пока звуки слов не стихнут в воздухе.
– Скажи мне, в чем здесь парадокс?
– В том, что странно обманщику говорить такое.
– Вот мое доказательство.
– Как же ты докажешь?
– Парадокс может существовать только в душе, – объясняет она. – Поскольку истинное значение парадокса от тебя ускользает, ты можешь уловить смысл лишь непарадоксальных вещей. В данном случае, странных. Только душа способна постичь противоречивые истины.
– Но если у меня нет души, тогда кто же я?
– Абакус, сконструированный из кожи, плоти и костей. Невероятный, сверхъестественный инструмент. Продукт Текне.

Например, у этих указателей могут быть разные требования к выравниванию данных. И при чтении из второго будет невыровненный доступ и исключение.
На мой взгляд UB ничем конкретным «не должно» быть.
UB возникает, когда программист нарушает некий контракт, на который рассчитывает компилятор (или код, или процессор — не суть).
И компилятор (или код, или процессор) просто продолжает работать, исходя из того, что контракт не нарушался.

Вот, допустим, есть у вас функция, которая принимает на вход нуль-терминированную строку. А вы ей подсунули строку без нуля на конце. И что она будет делать? Проверить, есть ли там нуль нельзя, длина ведь заранее неизвестна. Так что функция просто работает, как будто все в порядке.

Именно поэтому UB открывает дорогу оптимизациям — компилятор получает право делать далеко идущие выводы о том, как будет выполняться код, не проверяя этого ни на этапе компиляции, ни в рантайме. А просто рассчитывая, что программист соблюдает этот самый контракт.
Сказанного мной это вроде как не меняет.
Спасибо. Буду держать кулаки -_-'

Я до сих пор не понимаю, как в С++11 умудрились пропихнуть столько нетривиальной математики, вроде вихрей Мерсенна, эрмитовых сплайнов и распределений Коши, но при этом не заюзать константы вроде Пи и е.
Стандарт не требует наличия M_PI, и я вынужден пользоваться компилятором, в котором такой константы нет.

Скажите пожалуйста, а войдет ли в С++20 P0631 (Math constants)? Дождемся ли мы наконец-то числа Пи в стандарте? Или так и будем atan(1)*4?

Да, в union'e проблем с выравниваем действительно нет. Но вот доступ «не к тому» полю union'a — тоже UB, по тем же причинам, что и reinterpret_cast «не к тому» указателю.
Ну, я имел в виду конкретно ваш пример. Но я не могу придумать другого способа получить невалидный указатель, кроме как кастом из другого типа или другого «неправильного» доступа, через union, допустим.

Information

Rating
4,807-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity