Покрывайте код тестами. Покрывайте код тестов тестами. Покрывайте код тестов тестов тестами... (спустя несколько тысяч итераций) * переполнение стека *
Сюда нельзя вставить изображение, но думаю что все видели картинки из серии «unit tests passed, integration failed». И здесь тоже, отдельно взятые тесты не помогли бы совсем, от слова «никак». А так, вообще говоря, если для тестов нужны свои тесты, то все эти тесты написаны неправильно.
Кстати я вот буквально недавно думал что чем больше ты масштабируешь и уточняешь тесты, тем больше они начинают походить на копию приложения, которое покрывается тестами. Потому что я уже не знаю что сложнее - эндпоинты на беке который я тестирую, или интерсепторы которые я всё больше усложняю в сайпресе.
Тоже программист и такие ситуации случаются очень часто: когда видишь ошибку и понимаешь, что код на все 100% должен работать правильно, но он почему-то этого не делает.
А почему такая уверенность, что он должен работать? Вы же помните, что у вас 16-bit и есть пределы. Если посмотреть на ситуацию в целом со стороны, то я бы никогда не посчитал полностью универсальным код, который рассчитан для работы при отклонениях не на все 360x180 градусов. Я бы добавил туда комментарий: # проверь штатный угол отклонения ракеты перед переносом кода. Ладно бы ещё величина переменной была бесконечной: например, высота орбиты в метрах, тут уж точно можно только взять некоторый запас, дальше которого ракета физически улететь не сможет, и записать в комментарии в коде, что при переносе его на новую ракету нужно проверять, не увеличить ли битность переменной согласно новым техническим характеристикам.
@@_Goodless Вы явно НЕ программист. Во первых - вы уже знаете проблему, поэтому и советуете. Во вторых - проблема не в коде, а в отказе от тестов перед запуском. В третьих - вот код ошибки( переполнение в E_BH - для справки) P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S * ((1.0/C_M_LSB_BH) * G_M_INFO_DERIVE(T_ALG.E_BH))) G_M_INFO_DERIVE(T_ALG.E_BH)) - именно та функция которая брала 64 бита вещественного и превращала в 16 бит со знаком действительное. Кстати - если вы не в курсе, то весь этот код не использовался вообще. Тоесть в 5-й версии, он не был нужен.
Ну, это просто супер! Рассказ про чью-то маленькую ошибку, которая обошлась очень дорого, и Антон на первых же кадрах говорит - знакомьтесь, Ариан-5, а показывает - Ариан-6 !!! Браво! )
У боинга вроде была история, когда была плавающая проблема в софте, которая отлавливалась только в полете, создавая очень стремную ситуацию для всех кто на борту. Её долго не могли пофиксить. В конце концов организовали демо полет для инженеров, которые бысренько пофиксили её, когда почуствовали на себе ее последствия)
Надеюсь, устранили окончательно, т.е. сделали возможной работу на любых углах отклонения вплоть до 180° (просто потому что здесь физически существует предел этого параметра)? А то окажется, что следующая ракета летит ещё круче и переменная снова не рассчитана на такие значения.
@@jetspaser5935 к сожалению, нет. Компания боинг частенько практикует такое, когда кто-то заявляет о сбоях и о другой информации, которую не должен знать мир (Чтобы не начались суды и разбирательства).
А меня научили: перед делением в коде проверь знаменатель на ноль, даже если нуля там не будет никогда в жизни. А вот если не проверишь - то ноль обязательно проскочит.
Угу, а потом окажется, что не ноль, но достаточно малое число в знаменателе -- тоже даёт переполнение. И твоя проверка была ни о чём. Полностью корректная работа с ошибками возможна только при реализации подсистемы обработки исключений (типа try-throw-catch). Более простые варианты всегда имеют грабли или сильно неэффективны, а если расширять функциональность до полного подавления граблей, то в итоге почти та же схема обработки по сути и получится.
@@dmitryvodolazsky проверять double на ноль - надо быть альтернативно одаренным. А когда среднее или СКО считаешь - вполне рабочая схема. И не надо к мелочам докапываться, я указал принцип: даже там где нуля быть не должно, он может появиться
@@ZALMAN_AKILOV вообще то здесь речь идет об интеграционном тестировании, которое выполняется перед релизом продукта, а не проверках в рантайме. Они никак не влияют на производительность, потому что существуют отдельно от продукта.
Только вот в этом примере, поведение при переполнении это скорее особенность поведения языка, а не процессора. Точнее даже компиляторат Попробуй тот же раст, и там будет совсем все по другому
Я на кружке делаю всяких роботов на конкурсы. Мне дали задание: перенести программу с одного робота с какой-то штукой на подобие радара на другого. Я перенёс без изменений, ведь на моём она работала нормально. Но я не учёл, что у меня стоит Ардуино Уно, а там- Мини. Естественно там по-другому были воткнуты провода. Я включаю робота с новой программой, начинаю им управлять. Левая и правая гусеница работали нормально. Потом я начинаю вращать"Радар"... Робот начал хрустеть и передачу на радаре разломало к чёрту. Вот ещё один урок: всегда проверяйте пины на платах, пожалуйста.
А как весело отлавливать такие ошибки. Спасибо производителям потребительского железа за вагон оперативки. Можно без зазрения совести везде использовать double
Так в чем был баг? Это из разряда - пришел баг с работы домой, весь грустный грустный. Жена спрашивает его, что случилось, дорогой? А баг и отвечает - ты прикинь, эти уроды что придумали... Издали какие то документы... Теперь я не баг... Я фича..
legacy код - он такой. когда его писали были свои ТЗ и ограничения, т.е. условия, в которых он работает. может ввести в заблуждение, что он будет всегда работать во всех условиях, если он долго эксплуатировался и всегда работал корректно (в пределах условий ТЗ). на эти грабли многие наступают.
Ну так C и С++ не контролируют неявное преобразование типа, оно всё равно будет сведено к явному на этапе компиляции, разве что для отдельных случаев будет выдан варнинг у некоторых компиляторов в некоторых случаях (также из-за перегрузки функций C++ рекомендуется следить за типом операндов операций и аргументов функций вручную, иначе может быть вызвана не та функция с тем же именем). Явное преобразование - обычная операция в C и С++, её корректность не контролируется ни во время компиляции, ни во время исполнения. Переполнение - не совсем корректный термин для операции преобразования плавающего в целое. У плавающего своё переполнение, у целого своё. Конкретно при преобразовании double в uint16, вначале произойдёт преобразование в самое длинное целое (long например), а затем старшие биты будут просто отброшены. Вообще именно так (отброс старших битов) и может завершится самая обычная операция с целым (мультипликативная, аддитивная). И в стандарте многих языков это не является ошибкой! Целочисленное переполнение часто не контролируется вообще. Можно настроить компилятор на генерацию исключения отдельно. (В тоже время плавающее переполнение - всегда ошибка.) Есть ещё способ преобразовать плавающее в целое - изъятие мантиссы с отбросом экспоненты по маске в побитовой операции из союза (union) в составе double и 64-битного целого. Но такой способ не является универсальным, ибо нужно точно знать низкоуровневый формат плавающего, а он в стандарте языка не задан и варьируется у ЭВМ. Здесь вообще невозможно переполнение, по сути - это тот же отброс битов. Поэтому для корректного преобразования рекомендуется воспользоваться функциями, часто самописными, чтобы гарантировать обработку ошибок. Что же до неконтролируемости целочисленного переполнения, то оно бывает и полезно. А именно - такое поведение в мультипликативной операции есть по сути аж две операции подряд - умножение и остаток от деления на (длину максимального целого + 1). И в 32-битных генераторах псевдослучайных чисел формула R[i]=(R[i-1]*M)%L сокращается до R[i]=R[i-1]*M, где R[] - последовательность псевдослучайных целых, M - множитель последовательности, L - длина цикла последовательности (константы L и M подбираются особо и зависят друг от друга, для L=2^31 существует не так много приемлемых M, одно из которых, 65539, даёт в прошлом весьма распространённый алгоритм RANDU).
Читал байки про программистов еще во времена FIDOnet в районе 1996-2000 годов. Эта история там была. И еще несколько историй, в которых ошибки программистов привели к различным потерям. Найти бы тот текстик...
Технобайки это конечно хорошо, но где рука терминатора? А где законченный проект робота с Интро? Обещали закончить. А вообще может устроите конкурс кто лучше сделает данного робота?(награду естественно вам придумать)
Так у нас почти так же недавно ракету угробили при запуске с Восточного. Код ориентации исправно работал на Байконуре десятки лет. А запустили с восточного - стал крутить ракету не в ту сторону. Детская ошибка в коде стоила много лямов.
Одного не понимать - у компутера должна была быть изначальная информация о траектории и при получении неверной информации за короткий промежуток времени посчитать ее верной с учетом скорости массы и инерции? Сдается этих параметров в принципе не было... как и многих других...
@@ssh7437 Не, мой батя в конце 70-х это предсказывал. Только, поскольку был глубоко советским человеком, смотрел на это под другим углом, что мол "маленькая штучка моё" постепенно одерживала верх над идеей коммунизма.
@@ssh7437 да он и цитировал эту фразу "маленькая штучка моё" из какой-то советской классики. В этих "окнах" я так понял, что это лженаука какая-то, но у СССР были и чисто объективные причины, чтобы развалиться... Например, гиперцентрализация, которая сейчас и у ГОРФ есть.
оп, на 5 минуте Амперка говорит 12-33 мегагерц а обозначил в ролике как mHz, то есть милигерцы. Ай-яй-яй, вот из-за таких вот мелочей ракеты и разбиваются. ))))
запуск... установка тяги двигателей 80... высота: 1000 м Ошибка совместимости! Переполнение переменной! Диагностика установка положение ракеты: 90* Аварийное завершение работы 1 модуля... Аварийное завершение работы 2 модуля...
Там другое - там знак обратной связи поменялся на противоположный, и девайс ушел носом в землю, а должен был наоборот. Все-таки программерам таких вещей ДОЛЖНЫ читать основы ТАР, даже если это индусы.
@@alexlinde6695 там просто был неисправен датчик угла атаки, а великие программисты из боинга не учли ситуацию что он может быть неисправен и давать неверные данные. При этом ПО брало данные только с 1го датчика, даже если остальные были исправны. Датчик показывал что нос задрат - ПО пыталось его опустить, хотя это было не так. А пилоты не предприняли неправильные действия по устранению проблемы + это был в обоих случаях взлет и как следствие низкая высота
11:00 Чтобы компилятор выдавал предупреждения о "стремных" преобразованиях, нужно включить расширенные предупреждения в части преобразований. В gcc за это отвечает опция -Wconversion . В данном случае gcc честно предупреждает, что здесь результат преобразования может оказаться неожиданным. Да и вообще стоит включать -Wextra и -pedantic для пущей строгости. )
Приведения типов с потерей точности и потенциальными переполнениями генерируют варнинги. Сколь-нибудь ответственные сырцы компилятся минимум с -Wall -Wextra (это ещё не считая статических анализаторов). Эти варнинги не включены по-умолчанию потому что hello world новичка в си, который даст по 5 ошибок на строку, слегка отпугнет его от дальнейшего развития в эту сторону)
Ещё очень интересный компьютер-убийца - первопричина катастрофы ИЛ-76 на Камчатке в 1996 году. Там штурман по ошибке ввёл 153 широту вместо 53. Насколько я помню детальный отчёт, компьютер не сообщил об ошибочном вводе, а просто проглотил ведущую единицу, не выводя её на дисплей, так как не хватало разрядности. В результате у штурмана не было возможности визуально проконтролировать такой ошибочный ввод. Навигационная система также не проверила широту на правильность, и повела самолёт не туда.
Всем привет. Комментарий и лайк, для продвижения видео в тренды, чтобы в трендах видеть меньше мусора и больше нормального контента. Помните, если нравится и молчите, а не нравится бомбите - вы голосуете за отброс-контент. Спасибо за создание качественного контента! Всем добра.
Это как после CodeVisionAVR (в нём переменная INT подразумевает 16 бит) , перешёл на PIC CCS , я бился головой о стену три дня , думая почему не работает программа ....Оказалось что в пик ссs нужно указывать INT8 или INT16...А если не указал то она инт8 )))))))) Этого нигде не было написано .
После того, как первый раз столкнулся с бардаком с размерами дефолтных int итд, взял себе привычку всегда явно с размером указывать, а в тех редких случаях, где именно максимум процессорного слова надо выжать - обвешивать if'ами под разные случаи. Чуть больше писанины, но зато насколько целее нервы! :)
Однако это не значит, что старый код использовать нельзя. Можно и нужно, иначе придется каждый раз изобретать велосипед, и прогресс серьезно замедлится.
Расскажи как падают самолеты с четырехкратным резервированием вычислительных блоков. Из за плохих контактов. Или из за чего происходят аварии под управлением автопилотов.
2:45 >Но самое интересное, среди обломков нашли две инерциальные системы навигации. В них хранились логи с траекторией, которая еще не успела улететь на землю. простите, но я так и не понял эту фразу. что означает "логи с траекторией, которая еще не успела улететь на землю"? аналог черного ящика они нашли?
Вообще-то, приличный компилятор обязан выдавать варнинги при небезопасном приведении типов. Параноики могут включить режим "трактовать варнинги как ошибки", а оптимисты - подавлять выдачу варнингов в данном конкретном месте. Отдельным цимесов в истории с Ариян-5 является то, что ПО для её систем - писалось на офигенно безопасном языке Ада, а не на богомерзком опсном во все края Си, который в начале 80-х ещё даже не был стандартизирован в ANSI. P.S. *Инерциальная* навигационная система - это далеко не всякая навигационная система. На самом деле - она, заодно - исполняет ещё и функции системы ориентации (которая может носить разные названия и функциональность - например "гировертикаль") и обеспечивать пилотирование ЛА. Далеко не всякая система навигации занимается обеспечением пилотирования.
Простите, а сколько там была тактовая частота у MC68020? От 12 до 33 МЕГАгерц (MHz) или МИЛИгерц (mHz)? Казалось бы, всего-то другой регистр - но разница 9 порядков
Эту историю читал лет 12 назад, в каком-то компьютерном журнале. Заголовок был, что-то "Самая дорогая программная ошибка". Спасибо, освежил память.
Отличный выпуск
Выпуски на ракетную тематику усиливают желание увидеть новую ракету в вашем исполнении
мне во время просмотра пришло письмо от гикбрейнса!
Неее пусть соберут генератор водорода кислорода работающий на солнечных Панелях.
Жду когда ты соберёшь процессор. В оном из роликов ты обещал попробовать.
Спасибо за 300 лайков.
+
+
Согласен но у меня видео вышло 15 мин назад а твой комментарий 20 мин назад. Как?
На макетке из транзисторов?
Как он тебе его соберет
Проц с ядром:
- системная ошибка, оверхед пула, кернел паник! Помогите!
Логгер:
- я просто запишу это, ок
Логгер: чувак с камерой из мемов
У логгера так то больше и нет задач, кроме как записывания состояния машины
Покрывайте код тестами. Покрывайте код тестов тестами. Покрывайте код тестов тестов тестами... (спустя несколько тысяч итераций) * переполнение стека *
:)
Жиза)))))
Стэка мозга
Сюда нельзя вставить изображение, но думаю что все видели картинки из серии «unit tests passed, integration failed». И здесь тоже, отдельно взятые тесты не помогли бы совсем, от слова «никак». А так, вообще говоря, если для тестов нужны свои тесты, то все эти тесты написаны неправильно.
Кстати я вот буквально недавно думал что чем больше ты масштабируешь и уточняешь тесты, тем больше они начинают походить на копию приложения, которое покрывается тестами. Потому что я уже не знаю что сложнее - эндпоинты на беке который я тестирую, или интерсепторы которые я всё больше усложняю в сайпресе.
Тоже программист и такие ситуации случаются очень часто: когда видишь ошибку и понимаешь, что код на все 100% должен работать правильно, но он почему-то этого не делает.
А почему такая уверенность, что он должен работать? Вы же помните, что у вас 16-bit и есть пределы. Если посмотреть на ситуацию в целом со стороны, то я бы никогда не посчитал полностью универсальным код, который рассчитан для работы при отклонениях не на все 360x180 градусов. Я бы добавил туда комментарий: # проверь штатный угол отклонения ракеты перед переносом кода.
Ладно бы ещё величина переменной была бесконечной: например, высота орбиты в метрах, тут уж точно можно только взять некоторый запас, дальше которого ракета физически улететь не сможет, и записать в комментарии в коде, что при переносе его на новую ракету нужно проверять, не увеличить ли битность переменной согласно новым техническим характеристикам.
@@_Goodless комментарии наше всё
@@_Goodless Вы явно НЕ программист. Во первых - вы уже знаете проблему, поэтому и советуете. Во вторых - проблема не в коде, а в отказе от тестов перед запуском. В третьих - вот код ошибки( переполнение в E_BH - для справки)
P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S * ((1.0/C_M_LSB_BH) * G_M_INFO_DERIVE(T_ALG.E_BH)))
G_M_INFO_DERIVE(T_ALG.E_BH)) - именно та функция которая брала 64 бита вещественного и превращала в 16 бит со знаком действительное.
Кстати - если вы не в курсе, то весь этот код не использовался вообще. Тоесть в 5-й версии, он не был нужен.
Ну, это просто супер! Рассказ про чью-то маленькую ошибку, которая обошлась очень дорого, и Антон на первых же кадрах говорит - знакомьтесь, Ариан-5, а показывает - Ариан-6 !!!
Браво! )
Кстати норм заход для рекламы курсов тестировщиков был бы (:
Или для KSP 2
Любишь смотреть рекламу? 🤦🏻♂️
@@Hbyh66_ug67 Нет, просто отмечает подходящее для неё место в шуточной форме
Очень здорово, что не просто рассказал, но и наглядно показал как ведёт себя эта "особенность" в компиляторе.
5:20 вместо МегаГерц (MHz) написано МиллиГерц (mHz). Монтажеру привет.
мощный проц)) надежный как швейцарские часы))
1:29 лайк за KSP)
Как раз собирался это писать. Лайк.
16 бит хватит каждому
Ну что, битами померяемся?🤣
Мне и 8 заголову
а 512 битный процессор в 83 году на ВМФ СССР не хочешь?
@@gACZXC6ASDASD юзаю 4x битный 😎👍
@@СашаИванов-у2ц3с а поподробнее можно?
Классный выпуск, почаще бы такое, очень интересно
Ошибку устранили... вместе с тем, кто её допустил)
Мне кажется, такое только в нашей необъятной практикуют. Там все таки человеческий фактор сработал. Много, очень много людей допустило ошибку...
У боинга вроде была история, когда была плавающая проблема в софте, которая отлавливалась только в полете, создавая очень стремную ситуацию для всех кто на борту. Её долго не могли пофиксить.
В конце концов организовали демо полет для инженеров, которые бысренько пофиксили её, когда почуствовали на себе ее последствия)
Надеюсь, устранили окончательно, т.е. сделали возможной работу на любых углах отклонения вплоть до 180° (просто потому что здесь физически существует предел этого параметра)? А то окажется, что следующая ракета летит ещё круче и переменная снова не рассчитана на такие значения.
@@jetspaser5935 к сожалению, нет. Компания боинг частенько практикует такое, когда кто-то заявляет о сбоях и о другой информации, которую не должен знать мир (Чтобы не начались суды и разбирательства).
7:40 аааааааа! Кто так строит? Лёха ты же инжинер.
он так видит.
@@Rodogor_Hoenhaym но это не оправдание. Строить надо по нормальному.
@@ДжекПиронович нормальный инженёр, нормально построил.
Да ладно гироскопов побольше и как струна полетит)
@@robert1330 это гиродины.
А меня научили: перед делением в коде проверь знаменатель на ноль, даже если нуля там не будет никогда в жизни. А вот если не проверишь - то ноль обязательно проскочит.
А это не сильно нагрузит систему?
@@rawil6751 деление грузит намного сильнее, чем проверка условия
Угу, а потом окажется, что не ноль, но достаточно малое число в знаменателе -- тоже даёт переполнение. И твоя проверка была ни о чём.
Полностью корректная работа с ошибками возможна только при реализации подсистемы обработки исключений (типа try-throw-catch). Более простые варианты всегда имеют грабли или сильно неэффективны, а если расширять функциональность до полного подавления граблей, то в итоге почти та же схема обработки по сути и получится.
@@dmitryvodolazsky проверять double на ноль - надо быть альтернативно одаренным. А когда среднее или СКО считаешь - вполне рабочая схема. И не надо к мелочам докапываться, я указал принцип: даже там где нуля быть не должно, он может появиться
ахахах) Даже если знаменатель - константа, отличная от 0?
Спасибо! Теперь есть то что смотреть перед сном
"Покрывайте свой код тестами", самое важное в этом видео.
Все ведь тестами не покрыть, производительность упадет. Там и так овер дофига параметров нужно вычислять.
@@ZALMAN_AKILOV вообще то здесь речь идет об интеграционном тестировании, которое выполняется перед релизом продукта, а не проверках в рантайме. Они никак не влияют на производительность, потому что существуют отдельно от продукта.
@@ZALMAN_AKILOV Производительность упадёт... гм... во время тестирования. Какая неожиданность
@@Uni-Coder спасибо огромное, учту в будущем, а то пишу и не тестирую совсем, вот я дэбил
не экономьте на быдлокодерах
Только вот в этом примере, поведение при переполнении это скорее особенность поведения языка, а не процессора. Точнее даже компиляторат
Попробуй тот же раст, и там будет совсем все по другому
даже в C# для проверки переполнения есть `checked`
@@INshadow08 ещё один недоязык
Ура! Компьютер убийца продолжается!
Интересный контент. Спасибо за выпуск. Не знал про такую аварию.
неплохо неплохо)) KSP одобряем)
Я на кружке делаю всяких роботов на конкурсы.
Мне дали задание: перенести программу с одного робота с какой-то штукой на подобие радара на другого. Я перенёс без изменений, ведь на моём она работала нормально. Но я не учёл, что у меня стоит Ардуино Уно, а там- Мини. Естественно там по-другому были воткнуты провода. Я включаю робота с новой программой, начинаю им управлять. Левая и правая гусеница работали нормально. Потом я начинаю вращать"Радар"... Робот начал хрустеть и передачу на радаре разломало к чёрту.
Вот ещё один урок: всегда проверяйте пины на платах, пожалуйста.
Вот это я понимаю дебагинг кода)
Интересно Ариан 6 :) тоже сразу запустят с полезным грузом "Ну всё-же работало на 5 версии".
Вся суть ошибки
Машины должны быть безопасны для человека.
Переполнение буфера для переменной:
Машины должны убивать человека!
Беспилотные такси - игра в рулетку(с одним боевым патроном)
Как у классика поётся: нельзя обосраться, но мы обосрались...
Мне аж захотелось в KSP поиграть
да кстати
Мне тоже
Ещё один рассказ, где все произошло из-за переполнения переменной. Топ1 баг!
А как весело отлавливать такие ошибки. Спасибо производителям потребительского железа за вагон оперативки. Можно без зазрения совести везде использовать double
@@Евгений-п1л1ъ однажды и дабл может переполниться :-Р
@@Евгений-п1л1ъ а потом калькулятор гиг ОЗУ жрёт
Кадры из ксп вставил, это мы одобряем
Ксп это что ? Подскажи если не сложно. Поиск по фото херню выдает индийскую. Не смотрел, интересно.
@@Vlad_BY Игра Kerbal space program
Выпуск просто огонь, амперкины вы как всегда отличная команда.
Спасибо за видео.Коммент в поддержку!
Отличный видос жду еще таких)
Спасибо за видео! Было очень интересно)
За KSP респект конечно
Технобайки. Лучшая рубрика 👍👍👍👍👍❗❗❗❗👍👍❗❗❗
! Ждём от Амперки - сборка простого процессора на простых транзисторах !
Спасибо за ксп амперка!... Кстати для ксп есть адд-он Kos он добавляет возможность программировать корабли на бэйсике
Подскажите пожалуйста кадры из какого фильма использовались в моменте с 9:13
Так в чем был баг? Это из разряда - пришел баг с работы домой, весь грустный грустный. Жена спрашивает его, что случилось, дорогой? А баг и отвечает - ты прикинь, эти уроды что придумали... Издали какие то документы... Теперь я не баг... Я фича..
legacy код - он такой. когда его писали были свои ТЗ и ограничения, т.е. условия, в которых он работает.
может ввести в заблуждение, что он будет всегда работать во всех условиях, если он долго эксплуатировался и всегда работал корректно (в пределах условий ТЗ).
на эти грабли многие наступают.
Ну так C и С++ не контролируют неявное преобразование типа, оно всё равно будет сведено к явному на этапе компиляции, разве что для отдельных случаев будет выдан варнинг у некоторых компиляторов в некоторых случаях (также из-за перегрузки функций C++ рекомендуется следить за типом операндов операций и аргументов функций вручную, иначе может быть вызвана не та функция с тем же именем). Явное преобразование - обычная операция в C и С++, её корректность не контролируется ни во время компиляции, ни во время исполнения. Переполнение - не совсем корректный термин для операции преобразования плавающего в целое. У плавающего своё переполнение, у целого своё. Конкретно при преобразовании double в uint16, вначале произойдёт преобразование в самое длинное целое (long например), а затем старшие биты будут просто отброшены. Вообще именно так (отброс старших битов) и может завершится самая обычная операция с целым (мультипликативная, аддитивная). И в стандарте многих языков это не является ошибкой! Целочисленное переполнение часто не контролируется вообще. Можно настроить компилятор на генерацию исключения отдельно. (В тоже время плавающее переполнение - всегда ошибка.) Есть ещё способ преобразовать плавающее в целое - изъятие мантиссы с отбросом экспоненты по маске в побитовой операции из союза (union) в составе double и 64-битного целого. Но такой способ не является универсальным, ибо нужно точно знать низкоуровневый формат плавающего, а он в стандарте языка не задан и варьируется у ЭВМ. Здесь вообще невозможно переполнение, по сути - это тот же отброс битов.
Поэтому для корректного преобразования рекомендуется воспользоваться функциями, часто самописными, чтобы гарантировать обработку ошибок.
Что же до неконтролируемости целочисленного переполнения, то оно бывает и полезно. А именно - такое поведение в мультипликативной операции есть по сути аж две операции подряд - умножение и остаток от деления на (длину максимального целого + 1). И в 32-битных генераторах псевдослучайных чисел формула R[i]=(R[i-1]*M)%L сокращается до R[i]=R[i-1]*M, где R[] - последовательность псевдослучайных целых, M - множитель последовательности, L - длина цикла последовательности (константы L и M подбираются особо и зависят друг от друга, для L=2^31 существует не так много приемлемых M, одно из которых, 65539, даёт в прошлом весьма распространённый алгоритм RANDU).
Читал байки про программистов еще во времена FIDOnet в районе 1996-2000 годов. Эта история там была. И еще несколько историй, в которых ошибки программистов привели к различным потерям. Найти бы тот текстик...
Крутое видео я тебя смотрю уже 2 года так держать
нужно подобные ошибки в курс собирать и преподавать в университете, с более подробным разбором, а курс назвать, как не стать говнокодером
Технобайки это конечно хорошо, но где рука терминатора? А где законченный проект робота с Интро? Обещали закончить.
А вообще может устроите конкурс кто лучше сделает данного робота?(награду естественно вам придумать)
Лайк за нарезку из KSP)) порадовал
Чтоб "Протон" совершил подобный кульбит, так серьёзно не заморачивались - хватило пару штифтов спилить при установке датчиков угловой скорости ))
Так у нас почти так же недавно ракету угробили при запуске с Восточного. Код ориентации исправно работал на Байконуре десятки лет. А запустили с восточного - стал крутить ракету не в ту сторону. Детская ошибка в коде стоила много лямов.
Безусловно лайк!
Одного не понимать - у компутера должна была быть изначальная информация о траектории и при получении неверной информации за короткий промежуток времени посчитать ее верной с учетом скорости массы и инерции?
Сдается этих параметров в принципе не было... как и многих других...
Можем спать спокойно, Арнольд грохнул Скайнет )
Поправка: Скайнет выбрал не тот тип переменной и грохнулся сам.
@@chaoskrl В этой вселенной Скайнет сделал харакири)
@@ssh7437 Этот точно сам развалился. Имел фатальный недостаток и кучу мелких багов.
@@ssh7437 Не, мой батя в конце 70-х это предсказывал. Только, поскольку был глубоко советским человеком, смотрел на это под другим углом, что мол "маленькая штучка моё" постепенно одерживала верх над идеей коммунизма.
@@ssh7437 да он и цитировал эту фразу "маленькая штучка моё" из какой-то советской классики. В этих "окнах" я так понял, что это лженаука какая-то, но у СССР были и чисто объективные причины, чтобы развалиться... Например, гиперцентрализация, которая сейчас и у ГОРФ есть.
Думал сначала, про аппарат для лучевой терапии расскажешь, про ракету не слышал ранее, благодарю.
уже было )
оп, на 5 минуте Амперка говорит 12-33 мегагерц а обозначил в ролике как mHz, то есть милигерцы. Ай-яй-яй, вот из-за таких вот мелочей ракеты и разбиваются. ))))
Блин. Точно. Столько раз смотрел и не видел...
При использовании С++ можно включить что при даунсазинге автомачтиески проверяются границы и выдается эксепшн
5:21 - MHZ..., а не миллиГерц
Мегагерц
Мхз мегагерц
Очень странно, почему они не использовали MISRA.
Решили, что авось пронесёт?
запуск...
установка тяги двигателей 80...
высота: 1000 м
Ошибка совместимости!
Переполнение переменной!
Диагностика
установка положение ракеты: 90*
Аварийное завершение работы 1 модуля...
Аварийное завершение работы 2 модуля...
Привет создателям софта для Боинг 737MAX
Там нету так таковой ошибки, код работает так как написан без багов, там как бы сказать... Недоработка.
@@Noname-fl4cf От этого только страшнее. 2 самолета упало, погибло 315 человек.
Там другое - там знак обратной связи поменялся на противоположный, и девайс ушел носом в землю, а должен был наоборот. Все-таки программерам таких вещей ДОЛЖНЫ читать основы ТАР, даже если это индусы.
@@alexlinde6695 там просто был неисправен датчик угла атаки, а великие программисты из боинга не учли ситуацию что он может быть неисправен и давать неверные данные. При этом ПО брало данные только с 1го датчика, даже если остальные были исправны.
Датчик показывал что нос задрат - ПО пыталось его опустить, хотя это было не так. А пилоты не предприняли неправильные действия по устранению проблемы + это был в обоих случаях взлет и как следствие низкая высота
Как-то сразу подумал, что ошибка из-за отсутствия тестов. Был только вопрос ошибка в железа или в совте?
Статический анализатор кода мог бы найти эту ошибку
11:00 Чтобы компилятор выдавал предупреждения о "стремных" преобразованиях, нужно включить расширенные предупреждения в части преобразований. В gcc за это отвечает опция -Wconversion . В данном случае gcc честно предупреждает, что здесь результат преобразования может оказаться неожиданным.
Да и вообще стоит включать -Wextra и -pedantic для пущей строгости. )
мне вообще интересно зачем он gcc использовал, есть же прям предназначеный для винды msvc...
Леха, мы не эту ракету ждали! Но всеравно интересно. Есть ещё идеи по вжмванию после большого П?
Лехина ракета обошлась дешевле…
А если не видно разницы..)
Было бы символичнее, если бы не поместившееся число затёрло адрес возврата на стеке
2:03 дорогой же фейерверк вышел.
Из-за казалосьбы такой мелочи. Познавательно 😊👍
произошел шиндовс хас стоппед воркинг!!!
я когда переписываю свою программу часто использую куски кода старой, как итог надо переписывать еще раз
инфа стухла лет 20 тому назад. расскажи про новые баги-убийцы!
Где видео про float?
Приведения типов с потерей точности и потенциальными переполнениями генерируют варнинги. Сколь-нибудь ответственные сырцы компилятся минимум с -Wall -Wextra (это ещё не считая статических анализаторов). Эти варнинги не включены по-умолчанию потому что hello world новичка в си, который даст по 5 ошибок на строку, слегка отпугнет его от дальнейшего развития в эту сторону)
dropmefiles.com/WqDeY ))
Ещё очень интересный компьютер-убийца - первопричина катастрофы ИЛ-76 на Камчатке в 1996 году. Там штурман по ошибке ввёл 153 широту вместо 53. Насколько я помню детальный отчёт, компьютер не сообщил об ошибочном вводе, а просто проглотил ведущую единицу, не выводя её на дисплей, так как не хватало разрядности. В результате у штурмана не было возможности визуально проконтролировать такой ошибочный ввод. Навигационная система также не проверила широту на правильность, и повела самолёт не туда.
ну, если программа позволила ввести широту 153град, то респект кодерам ...
Всем привет.
Комментарий и лайк, для продвижения видео в тренды, чтобы в трендах видеть меньше мусора и больше нормального контента. Помните, если нравится и молчите, а не нравится бомбите - вы голосуете за отброс-контент.
Спасибо за создание качественного контента!
Всем добра.
Очень интересно 👍
классный разбор.
О Лёха вернулся
А зачем Kerbal space program на задний план лепить? Кто не знает, загуглите, это может перевернуть вашу жизнь)
Это как после CodeVisionAVR (в нём переменная INT подразумевает 16 бит) , перешёл на PIC CCS , я бился головой о стену три дня , думая почему не работает программа ....Оказалось что в пик ссs нужно указывать INT8 или INT16...А если не указал то она инт8 )))))))) Этого нигде не было написано .
После того, как первый раз столкнулся с бардаком с размерами дефолтных int итд, взял себе привычку всегда явно с размером указывать, а в тех редких случаях, где именно максимум процессорного слова надо выжать - обвешивать if'ами под разные случаи. Чуть больше писанины, но зато насколько целее нервы! :)
4:10 Я не видел не разу не на одном смартфоне ни одного гироскопа, только датчики притяжения.
Однако это не значит, что старый код использовать нельзя. Можно и нужно, иначе придется каждый раз изобретать велосипед, и прогресс серьезно замедлится.
Расскажи как падают самолеты с четырехкратным резервированием вычислительных блоков. Из за плохих контактов.
Или из за чего происходят аварии под управлением автопилотов.
1:55 - физика ksp)))
Кто понял тот понял...
Ну,если франция,то Ариан,а не эриан :) у французов все по-человечески.
Разрабатывайте сначала тесты, а потом код :) Test driven development
Так переполнение это же основа вычитания через сложение обратным кодом, там еще и флаг есть переполнения для тех кому надо
2:45
>Но самое интересное, среди обломков нашли две инерциальные системы навигации. В них хранились логи с траекторией, которая еще не успела улететь на землю.
простите, но я так и не понял эту фразу. что означает "логи с траекторией, которая еще не успела улететь на землю"?
аналог черного ящика они нашли?
Скорее всего просто память с сохранившимися логами.
Там если почить источники, посмотреть фото, видео много частей той ракеты хорошо сохранились.
Имеется в виду, что по логам ракета ещё не улетела так как система ориентации дала сбой и больше не писала нечего в логи. Как то так я понял.
Скорее всего там записана траектория до момента взрыва ракеты, а до взрыва, ракета ещё не падала (летела) на землю.
Вообще-то, приличный компилятор обязан выдавать варнинги при небезопасном приведении типов.
Параноики могут включить режим "трактовать варнинги как ошибки", а оптимисты - подавлять выдачу варнингов в данном конкретном месте.
Отдельным цимесов в истории с Ариян-5 является то, что ПО для её систем - писалось на офигенно безопасном языке Ада, а не на богомерзком опсном во все края Си, который в начале 80-х ещё даже не был стандартизирован в ANSI.
P.S. *Инерциальная* навигационная система - это далеко не всякая навигационная система. На самом деле - она, заодно - исполняет ещё и функции системы ориентации (которая может носить разные названия и функциональность - например "гировертикаль") и обеспечивать пилотирование ЛА.
Далеко не всякая система навигации занимается обеспечением пилотирования.
Не по колокольчику а по зову сердца)))
Симуляцию делали в Кербал?)
7:40 Бедные кербонафты, остались на орбите Кербина навсегда.
Аххаах видос серьёзный но геймплей где балуются в KSP
Простите, а сколько там была тактовая частота у MC68020? От 12 до 33 МЕГАгерц (MHz) или МИЛИгерц (mHz)? Казалось бы, всего-то другой регистр - но разница 9 порядков
мегагерц
@@user-mazuta, но на 5:09 на экране отображены именно милигерцы (mHz)
круто , продолжай.....
огонь выпуск
лайк, но видеоряд отвлекает и вообще бессмысленно вставлен 🤔
есть идея!собери генератор на радиации или похожем излучение
В офисе? Ты повторять будешь? Если да, то не жди, прогугли принцип роботы АЭС, и собирай))
@@sanya5660 там принцип долбанного самовара ,я про такой как он уже делать ,вроде там был экранчик на радиоволнах
Откуда кадры из взрывающихся ракет в космосе вроде такого фильма не видел
Леша, ты на 3d today fest поедешь?
... и используйте правильные инструменты разработки с зависимыми типами ,верификацией кода и проч. :)