Pull to refresh

Comments 14

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

1, 2, 4 и 5 случай как-то ещё можно понять и простить, но случай три…
С таким же успехом можно было просто рандомное число в указатель записать.
Это разные вещи. Тут ptr3 является указателем, про который стандарт говорит, что он «points one past the last element of the array object» (или «past the end of the array» в других местах). Такие указатели нельзя разименовывать, но они могут быть использованы для вычисления размеров (end - begin) либо как граница массива (p != end). Исходя из этого имеет смысл рассматривать их как отдельный случай в контексте данной статьи, а не просто как «рандомное число в указателе».
Т.е. malloc не может выделить байт, следующий за уже выделенным куском памяти?
Вполне себе может, к этому байту же не должно быть обращения от массива, для которого он находится за границей. В таком случае один и тот же указатель для разных массивов просто будет играть различную роль. Но это такой крайний случай, про «нельзя разименовывать» это в целом, так как там может быть что-то, а может и не быть (в этом случае ничего ошибочного ведь не произойдёт, поэтому ограничений на реализацию не возникает, требования только послабляются). Но компиляторы, вполне могут расчитывать, что такой указатель не будет разименовываться, когда видят, что он указывает за массив.
Какой раша? перевод же!
Флажок перевода такой неприметный… Прошу прощения, исправляюсь:

Ин Совет Раша не только переводят пиндостанские статьи о говнокоде, но и пишут об этом статьи на хабре.
Перевод: tedu

В оформлении косяки: выглядит, будто переводчик tedu, а автор SLY_G.
Да вообще не говорите. Раньше уж насколько плохо было с дизайном перевода, все путались, но авторы хабра решили все исправить. Я теперь всегда стараюсь плашки все читать, на них одна надежда. Найти ссылку на источник до сих пор с первого раза не могу, зная что она даже должна быть.
А вот в блогах компаний оформление другое и оно лучше:
Автор: ragequit <--> Julianne Tveten

Вон же указан автор оригинала и ссылка на текст по линку-имени «tedu»:
image
Сразу прошу простить, если я нарушу чувство гармонии тех, кто знает стандарт наизусть, но вот вывод gcc 4.9 на 5-й случай:
main.c:2:6: warning: array ‘a’ assumed to have one element
char a[];

Значит ли это, что gcc отступает от стандарта в данном месте?

P.S.: При этом sizeof(a) не компилится с ошибкой, что тип недоопределен.
Это связано с типом видимости и недоопределённостью символа, там даже пример такой приводится (C99, 6.9.2):
EXAMPLE 2 If at the end of the translation unit containing

int i[];

the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.
Так что GCC скорее сообщает о том, что реально происходит, так как это может быть следствием ошибки программиста (если добавить static или extern, то поведение более очевидное и предупреждение пропадает). Вообще, добавляйте флаг -pedantic, если хотите отключить расширения GNU-C и получить больше предупреждений об отклонении от буквы стандарта.
Открыл для себя слово надоедят, богат и могуч…
Sign up to leave a comment.

Articles