Size: a a a

2021 March 14

AG

Andrey Glebov in pro.cxx
Stepan
Невалид i ≥ N, т.к последний элемент будет иметь индекс N - 1.
{0, 1, 2, 3, 4} => N = 5
Элемента с индексом 5 не существует.
согласен, не очень ясно написал, но всё же выражение (array + 5) валидно - получается past-the-end указатель
вот *(array + 5) уже нельзя
источник

SS

Sergey Skvortsov in pro.cxx
Anton
нельзя
Можно, это специально проговоренный случай
источник

A

Anton in pro.cxx
Sergey Skvortsov
Можно, это специально проговоренный случай
это не будет элементом следующего массива
источник

LA

Liber Azerate in pro.cxx
Ilia Abernikhin
я не претендую на експерта по знанию стандарта но существует банальная цепочка россуждений которая и приводит меня к моему представлению:
1) елементы массивов идут последовательно даже если елементом масива выступает масив
2) прибавление числа к указателю на некоторый тип смешает указатель на это число
3) разыменование указателя указываюшего на кусок памяти выделеный под вашу програму ub вызвать не способно по определению

что мы имеем с точки зрения компилятора в foo перебор некоторых указателей, на легальной области памяти, да формально мы вышли за пределы масива, он должен состоять из 5ти елементов, но дальше идет память точно так же принадлежащая нам, и компилятор не имеет ничего против, он не анализирует как ты пришел к этому адресу, его волнует только принодлежит эта память тебе или нет, а память принадлижит тебе (смотри пункт первый) так что array + i, ошибка только И ТОЛЬКО логического характера...
Это может быть сколько угодно ошибка логического характера, конечно. Однако undefined behaviour существует для того, чтобы предоставить разработчикам компиляторов возможность для оптимизации. Есть и иные причины, конечно, в виде действительно серьёзных проблем. Однако в целом, основная суть UB в том, что после появления такого в коде это не программа на С++. Стандарт больше не предоставляет никаких гарантий на поведение данного кода. А так как разработчики компиляторов на это закладывается, компилятор может просто выкинуть код, который содержит UB. Кто-то может считать здравым хождение под двумерному массиву как одномерному, кто-то нет, однако в целом, считайте, это зависит от того, кто писал данный кусок компилятора, насколько он хотел соответствовать стандарту и т.д. И если вы отрицаете это, то не удивляйтесь, если в каком-то, пусть совершенно редком случае, но ваш код сделает непонятно что, пусть даже "ну совершенно нет на это причин"
источник

SS

Sergey Skvortsov in pro.cxx
Anton
это не будет элементом следующего массива
Не будет, но это не противоречит
источник

VS

Vlad Serebrennikov in pro.cxx
Anton
нельзя
expr.add#4.2 определенно пункт дня сегодня в этом чате
источник

A

Anton in pro.cxx
Vlad Serebrennikov
expr.add#4.2 определенно пункт дня сегодня в этом чате
это будет указатель, но не на элемент
источник

VS

Vlad Serebrennikov in pro.cxx
Anton
это будет указатель, но не на элемент
речь шла только о том, что указатель можно вычислить
источник

A

Anton in pro.cxx
Vlad Serebrennikov
речь шла только о том, что указатель можно вычислить
но вычислить указатель на него можно

на кого ?
источник

SK

Stas Koynov in pro.cxx
Anton
это будет указатель, но не на элемент
а на что-же? на память? на какую? на гипотетический элемент (если мы не вышли за пределы массива х) points to the (possibly-hypothetical) array element. но если это указатель на память, в котором лежит элемент массива х то что же это?
источник

SS

Sergey Skvortsov in pro.cxx
Anton
но вычислить указатель на него можно

на кого ?
На гипотетический элемент, очевидно
источник

IA

Ilia Abernikhin in pro.cxx
вы согласитесь со следуюшим: array[0] + 10 == &array[2][0]? с тем что эти адресса одинаковые?
источник

AG

Andrey Glebov in pro.cxx
нет, само сравнение - UB
источник

P

Ponytale 🇷🇺 in pro.cxx
Ilia Abernikhin
вы согласитесь со следуюшим: array[0] + 10 == &array[2][0]? с тем что эти адресса одинаковые?
&array[0] же
источник

AG

Andrey Glebov in pro.cxx
адреса одинаковые, но сравнение - UB)
источник

A

Anton in pro.cxx
Stas Koynov
а на что-же? на память? на какую? на гипотетический элемент (если мы не вышли за пределы массива х) points to the (possibly-hypothetical) array element. но если это указатель на память, в котором лежит элемент массива х то что же это?
именно это и не определено. это и есть UB
источник

S

Stepan in pro.cxx
А откуда взята информация о запрете вычисления? Это же обычная операция сложения. Другое дело - это доступ к этим данным.
источник

VS

Vlad Serebrennikov in pro.cxx
Stepan
А откуда взята информация о запрете вычисления? Это же обычная операция сложения. Другое дело - это доступ к этим данным.
источник

SS

Sergey Skvortsov in pro.cxx
Надо бы уже временно запинить, что ли
источник

IZ

Ilia Zviagin in pro.cxx
Roman Proskuryakov
Взять 15 элементов из массива длины в 5?
Ты вообще в курсе что в С нет возможности передать многомерный массив в функцию, и только с помощью такого вот трюка и можно его обрабатывать.


Никакого UB тут нет
источник