Обновить
34

Software Developer

0,2
Рейтинг
4
Подписчики
Отправить сообщение

Как минимум наземные растения сильно страдали бы от отсутствия питательных веществ.

Зато флора зависит от фауны.

С майнкрафтом тоже совсем не баг, просто механика такая.

тут вопрос в его власти

Ровно в той же мере, что и вопрос предоставления своей территории.

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

В обычной программе таких диагностик будут сотни, а польза совершенно неочевидна. Каждое разыменование указателя теперь подписывать прагмой, что ли?

Если заинлайнит, то может. Вопрос в том, зачем тут диагностика, куда пихать прагму и как следить за её валидностью.

Если мы успели разыменовать указатель, и компилятор это увидел, он автоматически считает, что указатель не NULL, а значит проверка лишняя и её можно выкинуть.

Сравнение с NULL выкидывается не потому что в нём UB, а потому что указатель не NULL, иначе бы предыдущее разыменование приводило к UB. Поскольку в программе UB не может использоваться, значит условие можно выкинуть.

6.5.3.2 If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.
Плюс сноска: Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer...

Разыменование NULL является UB, поэтому увидев проверку на NULL после разыменования компилятор вправе выкинуть проверку.

Ты мог взять указатель на переменную на стеке и передать в функцию, проверяющую указатель на NULL. В каком месте и зачем писать прагму? Что делать, когда прагма устареет, а ты забудешь её обновить?

Количество false-positive будет нереально большим, зачем это нужно? Вот пример, у тебя есть указатель на структуру, ты его разыменовываешь для каких-нибудь целей, а потом ниже по коду вызываешь другую функцию, в которой есть проверка на NULL. Компилятор инлайнит вторую функцию, видит проверку на NULL после разыменовывания, и зная про UB может эту проверку выкинуть. Но на что тут жаловаться и главное зачем?

А на практике это UB, которого пугаются сишники и хотят избавиться от самого понятия, хотя оптимизация в принципе возможна именно потому что он есть.

Тоже склоняюсь к этому варианту. Вроде по отдельности слова логичные, но смысл полный бред.

Я про этот коммент и пишу, он бессмысленный.

И? Какая разница, функция оперирует своей локальной копией, которая по соглашению вызовов вообще могла прийти в регистре.

В примере 4 никакого UB нет, там же знаковые инты, они могут быть меньше нуля и приводить к сумме меньше нуля безо всякого переполнения.

Я что-то не понял первый пример, как data может указывать на factor, если factor - локальная для этой функции переменная? Или компилятор исходит из того, что мы в вызывающей функции можем сформировать указатель на локальную переменную вызываемой?

Потому что реальные террористы делают то же самое.

Информация

В рейтинге
2 853-й
Зарегистрирован
Активность