LINUX.ORG.RU

Ответ на: комментарий от filosofia

Весь рантайм — Undefined Behavior, Unspecified Behavior, and Implementation Speciifc.

Это.

Ответил на все вопросы как былоб в GCC10-11, на третьем вопросе понял что чтото тут подозрительно (результат того что в 3-м будет разным на ARM и x86-64 это я сам помню)

но вспоминая те самые «умные книжки»(из 80-х) и «умных преподов» которые впихивали что увеличивать адрес указателя вручную это «безопасно» и делать итерацию char/int/uint считая переполнение безопасным… зависит от ситуации, но старый код я никогда уже не использую, пусть идут куда подальше со своими бессмысленными оптимизациями

svv20624
()
Последнее исправление: svv20624 (всего исправлений: 1)
Ответ на: комментарий от a1batross

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

я уже который год тонну Сишного кода переписываю и ругаюсь даже в багтрекере гугла(и не только, у всех корпораций Сишный код из каменного века откопанный, тот что в продакшен-опенсурс библиотеках) где они указатели ручками пересчитывают и поэтому их «код» нигде кроме как на x86-64 не работает…

но тут не было акцента на «теорию», я инстинктивно пересчитал все как былоб в x86-64

былбы вопрос - результат этого кода одинаков на всех платформах? яб отвечал подругому очевидно

svv20624
()

«I don't know.» - некорректная формулировка, чтобы подлов получился.

Я знаю ответ и ответ - «undefined» или подобное.

alexru ★★★★
()
Ответ на: комментарий от a1batross

Тест на самом деле достаточно подлый. :)

да как выше сказали

Undefined Behavior, Unspecified Behavior, and Implementation Speciifc.

но к этому привыкаешь как к норме при первой подготовке к релизу своего софта

и это не «тест» если я вижу такой «тест» на собеседовании я понимаю что надо бежать куда подальше (последние собеседования с такими тестами я заваливал вопросами в в ответ этих тестировщиков что выходило так что не они меня тестируют а я их, все спрашивал и до минорной версии компиляторов процессоров ОС установленных патчей, если хотите валить то пробуйте лул(конечно работы не получил, пару раз отказали просто на эмоциях(раз у них эмоции даже на тесте все очевидно - помойка) или просто говорили что не подхожу))

ах да вспомнил еще одно собеседование несколько месяцев назад, где поставили «невозможную задачу» и сказали реализовать за пару дней(показать готовое), (невозможную и неимеющую смысла в продакшене), ну я и сделал скомпилировав C++ в LLVM компилятор в джавсрипт и запихнув все решение в электрон - сказали «результат не соответсвует условию». (какое задание такое и решение лол)

svv20624
()
Последнее исправление: svv20624 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Так компиляторы разные бывают. Например, во всяких DSP частенько char имеет 16 или 32 бита. Потому что процессор в принципе не умеет 8 битные данные адресовать

Ты бы еще 7-битные char вспоминил. Сейчас 99% всего железа — это однотипные машины 32-64 бита.

byko3y ★★★★
()
Ответ на: комментарий от mxfm

Как показал тот случай все наоборот - важно мнение стандарта и компилятора, а не мнение форумного программиста.

-fwrapv — и все проблемы заканчиваются.

byko3y ★★★★
()
Ответ на: комментарий от praseodim

Программисту важно понимать, что указатели в Си не являются низкоуровневыми

Да-да, высокоуровневые указатели Си — это оксюморон. Потому что все знают, но они нихрена не высокоуровневые, потому что по итогу всю корректность придется проверять рукам — сам компилятор не проверяет ничего, более того, теперь еще и опирается на допущение, что ты, мартыха, уже всё проверил и у тебя вся память адресуется корректно.

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)

А вы знаете про стандарт С?

Да.

pacify ★★★★★
()

You scored 2 points, which is not so bad. You know that there are things you don’t know. And yes, the right answer to every question is “I don’t know”.

tz4678 ★★
()
Ответ на: комментарий от peregrine

i dont know ответил? я на си не пишу и никогда не писал. лет 8 назад helloworld написал на qt - с меня хватило

tz4678 ★★
()
Ответ на: комментарий от byko3y

Изначально было высказано такое мнение - на стандарт можно срать, «я делаю что хочу». Вам был приведен пример обратного - изменение gcc сломало подобный код настолько, что вызвало батхерт у программиста, который тоже был настроен на «отмену» стандарта, ч. т. д.

mxfm ★★
()
Ответ на: комментарий от praseodim

Прикольно, я об этом забывал. Этак современный Паскаль более низкоуровневый, хе-хе.

Вся та статья - хороший пример того, как человек не понимает как работает язык и для чего создан, применяя к нему критерии из других языков, и главное принцип «язык должен работать так, как мне, Василию Пупкину, хочется здесь и сейчас».

Программисту важно понимать, что указатели в Си не являются низкоуровневыми. Стандарт постарался полностью искоренить какую- либо связь языка с реальным миром. Даже сравнение указателей, ссылающихся на разные объекты, объявлено неопределённым поведением (раздел 3.3.8, «Relational operators»):

«искоренить связь языка с реальным миром» это явное накручивание (сам тот горе-программист оторван от реального мира). Стандарт Си создан для обеспечения совместимости с разными платформами, где указатели на разные типы могут вести себя по-разному.

mxfm ★★
()

Чем больше я читаю програмистские срачи, тем больше радуюсь, что не занимаюсь программированием профессионально.

Представим себе ситуацию: я купил автомобиль, который на дороге ведет себя в общем предсказуемо: повернул руль влево - машина поехала влево, повернул вправо - поехала вправо. Но если руль поворачивать дальше, то машина начинает ехать в противоположную сторону. Переполнение поворота.

Логично, что первым делом я сообщу производителю об этом баге (если выживу, бгг) и, коли я вынужден продолжать ездить пока на этом авто, буду стараться избегать проворачивать руль больше чем нужно. Либо вовсе откажусь от использования этого авто.

Производитель исправляет баг и авто, сколько ты не проворачивай руль вправо, будет ехать только вправо. Влево - влево. Ок, все встало на свои места.

Но тут на арену выходят упоротые автолюбители, которые начали стучать ножками и требовать откатить изменения, потому что они привыкли к странным особенностям их авто.

И вот толи я дурак (причем напару с производителем), толи все-таки те автолюбители опасны для общества и их надо изолировать. Мне почему-то второй вариант ближе.

И вот я представил, что в своей деятельности я каждый день по поводу новых фич должен спорить с такими вот упоротыми автолюбителями, доказывая в общем-то очевидные вещи.

Аж передернуло…

@byko3y

Oberstserj ★★
()
Последнее исправление: Oberstserj (всего исправлений: 1)
Ответ на: комментарий от Oberstserj

Представим себе ситуацию: я купил автомобиль, который на дороге ведет себя в общем предсказуемо: повернул руль влево - машина поехала влево, повернул вправо - поехала вправо. Но если руль поворачивать дальше, то машина начинает ехать в противоположную сторону. Переполнение поворота.

На МиГ-15 такая фишка была при около-звуковых скоростях.

luke ★★★★★
()
Ответ на: комментарий от alegz

Кому вообще в реальности хоть раз понадобилось исполнять что-то типа i++ + ++i?

Ну непосредственно прямо вот так конечно никто не пишет. Это обобщенный случай того, что иногда получается при написании кода. Иногда бесконечная игра с указателями и не к такому приводит.

Лично я быдлокодер, мне не лень разбить все на миллион строчек и понавводить переменных, чем выстраивать сокращенные, но жутко красивые конструкции. Но даже я иногда сваливаюсь в такое.

Oberstserj ★★
()
Ответ на: комментарий от luke

На МиГ-15 такая фишка была при около-звуковых скоростях.

На планерах так в штопор входят. Но там, если посмотреть хотя бы понимаешь логику происходящего. Но вот специально писать код так, чтобы он использовал по сути дыру в компиляторе - это какое-то запредельное ССЗБ

Oberstserj ★★
()
Ответ на: комментарий от cvs-255

Если там не " << 32" а " << i" написано, то предварительная проверка того, что «i<32» это дополнительная операция, нужность которой определяет уже сам программист (в коде в явном виде).

А то кажется 8086 (или какой-то другой из тех времен) вообще только >> 1 аппаратно поддерживал

Точно не он

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от byko3y

«Не работать» будет только у того, кто мне машет стандартом и говорит «это не может работать».

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

Oberstserj ★★
()
Ответ на: комментарий от Oberstserj

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

Да, я прав, потому что своим сорцам ставлю опции компиляции "-fwrapv -fno-strict-aliasing". А ты можешь дальше наслаждаться мастерскому избеганию UB в неочевидных случаях.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Ну как по мне, то мастерское избегание UB есть составляющая критерия макстерства программиста. Ты, конечно же можешь быть с этим не согласен. Я же просто возьму чужой код, который РАБОТАЕТ. И мне насрать что твой код весь из себя правильный. Он НЕ работает.

Oberstserj ★★
()
Последнее исправление: Oberstserj (всего исправлений: 1)
Ответ на: комментарий от Oberstserj

Ну как по мне, то мастерское избегание UB есть составляющая критерия макстерства программиста.

Макстерства сишника, разве что.

Miguel ★★★★★
()
Ответ на: комментарий от Oberstserj

я купил автомобиль, который на дороге ведет себя в общем предсказуемо

С одной стороны, прошивку для автомобиля тоже программисты пишут, с другой стороны в этих сферах есть MISRA, и совсем овощей туда не берут.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

С одной стороны, прошивку для автомобиля тоже программисты пишут, с другой стороны в этих сферах есть MISRA, и совсем овощей туда не берут.

Там полно глюков. Всё держится на тестировании, и если какую-то ситуацию не тестировали, то она, скорее всего, не работает. Особенно плохо стало, когда тестировать стали не немцы, как раньше, а индусы. Те просто return true ставят.

Пример из моей жизни: вода попадает в блок полного привода, отваливается ABS совсем, двигатель теряет коробку, может зависнуть блок управления водительским креслом. Чисто из-за логической ошибки.

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

mv ★★★★★
()
Ответ на: комментарий от mv

совсем овощей туда не берут

тестировать стали не немцы, как раньше, а индусы

Те просто return true ставят.

Значит уже берут.

отваливается ABS совсем, двигатель теряет коробку, может зависнуть блок управления водительским креслом

Всё больше понимаю людей, которые предпочитают ВАЗ-классику или доинжекторную ниву современным изделиям.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

Всё больше понимаю людей, которые предпочитают ВАЗ-классику или доинжекторную ниву современным изделиям.

Машины апокалипсиса ибо!

На ещё шведской 16-летней Вольво (не из-под Форда) поменял/перебрал просто вообще всё. Кроме бензонасоса. Фордовской же даже до этого по надёжности далеко, та вообще сразу с конвейера разваливается, регулярно чего-то отрыгивает.

Пару лет назад со злости купил Тундру, а не очередную Вольво. Тяжело, жулезно, надёжно.

mv ★★★★★
()
Ответ на: комментарий от Oberstserj

Нет, конечно, есть куча народу, которые не программисты, но и не сишники.

Miguel ★★★★★
()
Ответ на: комментарий от praseodim

Даже сравнение указателей, ссылающихся на разные объекты, объявлено неопределённым

Разумеется. Вот возьмем какой-нибудь AVR. Там для данных и кода - разное адресное пространство (гарвардская архитектура). И сравнивать указатели на данные и на функции - не имеет смысла

cvs-255 ★★★★★
()

Еще одному умнику захотелось посмеяться над сишкой, а посмеялся над собой ибо еще эйнштейн говорил, что гений что-то там над хаосом

IvanR ★★★
()

Давайте я еще этот тест расширю. Вот например

int32_t a = 1;
a = a << 31;
Чему равно a?
1) 1
2) -1
3) -2147483648
4) I don't know

или вот
uint32_t a = 1;
a = a << 32;
Чему равно a?
1) 1
2) 0
3) 2147483648
4) I don't know

или вот
int32_t a = -1;
a = a >> 1;
Чему равно a?
1) -2
2) 1073741824
3) 0
4) I don't know

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от SZT

Давайте я еще этот тест расширю.

https://imgur.com/a/XYfENsI

https://en.cppreference.com/w/c/language/operator_arithmetic

Ну да, все к «I don’t know»

For signed lhs with nonnegative values, the value of LHS << RHS is LHS * (2 в степени RHS) if it is representable in the promoted type of lhs, otherwise the behavior is undefined.
The behavior is undefined if rhs is negative or is greater or equal the number of bits in the promoted lhs.
For negative LHS, the value of LHS >> RHS is implementation-defined where in most implementations, this performs arithmetic right shift (so that the result remains negative). 
fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от a1batross

Ну не скажи, я вот своей барышне дал его поотвечать с подсказкой «отвечай честно», ну она за несколько десятков секунд сделала 5/5.

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

luke ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.