paint-brush
Можно ли намеренно сделать ошибку?к@marcushaldd
738 чтения
738 чтения

Можно ли намеренно сделать ошибку?

к Daria Leonova5m2023/12/03
Read on Terminal Reader

Слишком долго; Читать

Исследуйте злонамеренное царство преднамеренных ошибок в коде, где разработчики игриво бросают вызов нормам и раздвигают границы обычного программирования. От управления уровнями доступа до маскировки ошибок в более крупных функциях — откройте для себя искусство создания целенаправленных ошибок в коде. Это причудливое путешествие предлагает вам рассмотреть неожиданное и охватить творческую сторону программирования, и все это для развлечения, а не для применения на рабочем месте.
featured image - Можно ли намеренно сделать ошибку?
Daria Leonova HackerNoon profile picture

Отказ от ответственности : Эта статья написана исключительно для развлечения. Не пытайтесь повторить это на работе. Однако дома делайте все, что хотите.


Мы, разработчики, регулярно сталкиваемся с ошибками , это всего лишь часть нашей работы. Поэтому на первый взгляд вопрос «Можно ли специально сделать баг?» может показаться банальным — «Да, конечно, я могу написать баг». Однако, если вдуматься, все уже не кажется таким очевидным.


Дело в том, что ошибка — это не то же самое, что сломанный код . Баг – это ошибка, недостаток в целом.

рабочая программа.


Термин «ошибка» в контексте проблем с программным обеспечением возник в 1947 году, когда моль вызвала сбой в работе компьютера Harvard Mark II. Инженеры буквально обнаружили мотылька, застрявшего в одном из реле, и назвали это «первым реальным случаем обнаружения ошибки».


В чем проблема?

Известно, что мир хорошо описывается математическими формулами. А формулы на самом деле являются алгоритмами. Поэтому, если мы смогли описать какое-то явление математически, то исправить полученную формулу так, чтобы она лишь иногда давала неверный результат, — задача нетривиальная. Тем не менее, не время отчаиваться. Здесь нам могут помочь граничные условия . Мы все видели это if index == 0 {…} else if index == n-1 {…} . С границами всегда что-то не так 🤷‍♀️. Итак, отметим первую идею создания бага — игнорирование крайних случаев .





В общем, перебор массивов — это кладезь потенциальных ошибок. И самый распространенный из них — index out ofbounds . Если вы никогда не сталкивались с такой вещью, вы никогда не программировали. К сожалению, эта ошибка настолько популярна, что люди начали писать безопасные оболочки для массивов, что-то вроде array[safe: index] . Так что сегодня ваши коллеги вряд ли утвердят какой-либо кодекс без этой штуки. Попробовать можно, но это вряд ли…



Распространенные ошибки включают переполнение стека . Рекурсивный алгоритм может повторяться бесконечно, если нет условия выхода. Рекурсия здесь кажется необязательной — напишите while true , и все готово. Однако, опять же, популярность бага играет против нас. Разработчики прекрасно знают о потенциальных проблемах бесконечных циклов, и на код-ревью их взгляд обязательно бросится на что-то подобное 👮

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


 var coditionCounter = 0; class A { func foo() { while coditionCounter < 10 { coditionCounter++; B.boo(); } } } class B { func boo() { coditionCounter--; } }



Общие советы

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


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






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


Мой общий совет таков (вы поделитесь своим в комментариях):


  • Управляйте уровнем доступа . Чтобы вернуться назад, измените значения важных параметров в самых неожиданных местах. Сделайте это через несколько занятий, как если бы вы были VPN.

  • Реализуйте неожиданную логику в дочернем классе. Короче говоря, сломайте принцип L в SOLID .

     class A { func decrease() { x--; } } class B: A { override func decrease() { x++; } }
  • Скрывайте свои коварные изменения в более крупных функциях. Чем больше очередей, тем лучше – затеряйтесь в толпе.

  • Используйте тот же принцип в запросах на включение. В небольшом пиаре вероятность быть замеченным выше.

  • Попробуйте разбить ошибку на части и поместить их в разные пул-реквесты . Если можно, то и разным рецензентам.

  • Найдите слабые места вашего QA и завоюйте его доверие. Или отвлекать их разговорами во время проверки.


Кстати, вы слышали о Гейзенбаге? Это ошибка, которая исчезает или меняет свое поведение во время исследования/ отладки . Как кот Шредингера. Идеально, если решение проблемы не будет поручено вам.




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


Ты можешь


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


Рейс 501 «Ариан-5». Одна из самых дорогостоящих ошибок в программном обеспечении произошла в 1996 году, когда ракета «Ариан-5», выполнявшая миссию «Кластер», взорвалась всего через 40 секунд после старта. Причиной сбоя стала программная ошибка в системе наведения ракеты.


Марсианский климатический орбитальный аппарат НАСА: В 1999 году НАСА потеряло Марсианский климатический орбитальный аппарат из-за ошибки программного обеспечения. Программное обеспечение использовало британские единицы (фунт-секунды) вместо метрических единиц (ньютоны-секунды), что привело к сгоранию космического корабля в марсианской атмосфере.


Более того, некоторые ошибки могут стать функциями, например, прыжки через стену в Марио или поведение Махатмы Ганда в Civilization … возможно.


Разработка ошибки — это способность продумать свой алгоритм и тщательно предвидеть возможные проблемы. Так что, даже если у вас нет причин оставлять ошибку в коде, об этом все равно стоит задуматься.