в каком-либо сишном компиляторе(gcc особенно интересует).
Иными словами, является ли вот этот код валидным?
void foo() {
int* ptr;
if (true) {
int val = 4;
ptr = &val;
}
}
Раньше был уверен что только при выходе из функции, а сейчас...
UB
является, провисшие указатели не запрещены. Но после if-а разыменовать указатель нельзя
ptr хранит адрес val. Со значением ptr не происходит ничего.
работает но это UB
и компилятор предупреждать будет
Это код валидный.
.... потому что он не делает ничего
Ну и на самом деле, с движением стек поинтера это никак не связано. С точки зрения стандарта разыменовывать поинтер после ифа все равно нельзя, а с точки зрения "наиболее прямой трансляции в машинный код" ты его сможешь разыменовать независимо от того, когда RSP двигается
Это не ub
А что ?
Ничего. Это просто код, который ничего не делает. Если ты взял адрес объекта, который потом сдох, но не попытался узнать что по этому адресу находится, то это не запрещено. Я знаю адрес дома, который снесли, но не пойду в этот дом.
Нет, не значит.
Ну это UB
Здесь нет никакой неопределённости
Может. Некоторые компиляторы на х86 выделяли место под локальные переменные ровно на момент их использования. Даже если сейчас такого нет, то все равно в твоем примере обращение по ptr будет UB (но в текущем куске UB пока нет).
Ладно, уговорил. Для тебя компилятор будет делать исключение в таких случаях 😂
отсутствие поведения = неопределенность
Дык до разадресации нет никакого ub
там вообще ничего нет, в этом и неопределенность
Ага. Программист не написал программу, казалось бы, ничего нет, ан нихрена - UB 😂😂😂
В стандарте нет такого понятия как "неопределенность".
программа - это определенное поведение, а ее отсутствие - неопределенное
А если без околофилософских рассуждений? Пункт стандарта покажете?
тащемта, ты после сноса и адреса не знаешь. значение указателя в конце функции не определено (что не запрещает его существование, но это более сильное ограничение, чем "нельзя разыменовать")
А вот Resharper для тривиальных типов уверен в обратном🤔
Не упоминай это нечто😅 Я больше к тому, что компиль может так делать. Лично видел сгенеренный асм как раз такой, но компиль уже не вспомню
Любопытно. Там не было alloca каких-нибудь?
Да нет, как раз sub rsp, <нужное кол-во байт> в рамках одной функции И add соответственно
3.27 [defns.undefined] undefined behavior behavior for which this document imposes no requirements [Note 1 to entry: Undefined behavior may be expected when this document omits any explicit definition of behavior
Применительно к примеру тами поведение есть присваивается указателю адрес и оно определено
Почему? Там invalid pointer value.
Обсуждают сегодня