Эта монета ничуть не похожа на 25-центовую американскую монету. Она обрезана по краям, что делает ее немного похожей на серебряный цветок. К немалому удивлению Хью и его друзей, на дисплее высветилась цифра «25» – машина ошибочно приняла монету за американский четвертак. Они пошарили по карманам и нашли еще три монетки в 10 центов. На дисплее последовательно высветились цифры «0,50», «0,75» и, наконец, «1,00» (на острове довольно высокие цены). Они нажали кнопку «Выбрать», и –
Много лет спустя Хью узнал, что машина измеряла диаметр и вес каждого объекта, попадавшего в прорезь. По стечению обстоятельств, багамские 10-центовики имели почти тот же вес и диаметр, что и американские четвертаки. Не понимая механики машины, Хью и его друзья применили по сути метод случайных входных параметров в надежде на то, что это приведет к чему-то интересному. В этом и состоит суть фаззинга: применение входных параметров с тем или иным элементом случайности и последующим изучением неожиданных исходов.
Машина, торговавшая газировкой, нормально реагировала на обычное использование, однако отказала, столкнувшись с необычным сценарием. С этой проблемой сталкивалось множество систем, начиная от атомной станции в Фукусиме и заканчивая «Титаником». Люди, оценивающие подобные системы, обычно ограничены правилами логики, но реальный мир редко бывает столь же негибким. Говоря иными словами, системы
Именно в этот момент на сцене и появляется фаззинг. Тех, кто занимается им, можно сравнить с обезьянками на амфетаминах, пробующих любые действия в надежде что-то сломать. У них мало правил и почти нет ограничений. Они просто делают то, что считают нужным. Нормальный, рассудительный человек не будет вопить в течение часа на машину, торгующую газировкой, и ожидать, что в результате получит бесплатную бутылку. А заряженная амфетаминами мартышка вполне может это попробовать. И кто знает, может быть, в машине есть какой-нибудь сенсор, изучающий окружающую какофонию: думая, что звуки исходят от грузовика, развозящего воду, она разблокирует свою защиту. Современные системы настолько сложны, что никто не знает точно, к чему могут привести необычные стимулы. Хью лично столкнулся с этим во время своего полета из Лас-Вегаса в Орландо{27}
.Перед каждым сиденьем самолета был небольшой экран, вмонтированный в спинку. Пассажиры во время рейса могли смотреть один из нескольких телевизионных каналов или играть в несколько простых игр. Одна из игр выглядела поразительно похожей на классическую стратегическую игру «Тетрис», в которой игроки пытаются перемещать падающие объекты так, чтобы они образовывали завершенные горизонтальные линии. Причем предлагалось указать количество элементов, которые можно было заранее увидеть в ходе игры: «ноль» означал полную непредсказуемость, а «четыре» позволяло планировать на несколько шагов вперед. Для того чтобы получить максимальное преимущество, Хью начал нажимать большую кнопку со знаком «+» на экране и постепенно дошел до максимального значения, равного четырем.
Рядом с его креслом располагалась небольшая телефонная консоль, с помощью которой пассажиры могли позвонить друзьям и членам семьи всего за 22 доллара в минуту. Хью заметил, что у телефона имеется цифровая клавиатура и что с ее помощью можно было контролировать «Тетрис», в том числе и уровень сложности. Он попытался ввести с помощью телефонной клавиатуры «10», но безуспешно. Значение на экране сначала изменилось на «1», а затем на «0» – то есть два нормальных, вполне допустимых значения. Разочарованный, Хью предположил, что у него нет никаких вариантов ввести в игру двузначные значения. Он попробовал цифру «8» – опять безрезультатно. Номер на экране даже не изменился.
Затем он попробовал цифру «5»… И – ура! – игра ее приняла!
Цифра «5» представляет в данном случае немалый интерес. Тестеры программных продуктов называют его пограничным значением{28}
, поскольку оно лишь немного превышает максимально допустимое значение (пограничное), которое была готова принять программа (в данном случае «4»). Частая ошибка в программировании состоит в «ошибке на одно значение» при создании логики программы{29}. К примеру, программист мог намереваться написать код, означавший: «Значение параметра должно быть меньше пяти».Однако фактически программный код означал: «Значение параметра должно быть
В большинстве языков программирования разница между этими формулами состоит в одном-единственном нажатии на клавишу.