Раз букашка, два букашка…

Заметка скорее лирическая, чем техническая. Несколько месяцев назад довольно неожиданно начал сбоить код двухлетней давности. Сначала занимался поиском ошибки изредка, но, когда исправление уже стало необходимым, плотно занялся, и просидел почти неделю. После тестирования было найдено “проблемное” место, где изменялись свойства нескольких объектов, а те, в некоторых случаях, могли изменить общий объект, но только один раз. Свойство общего объекта описано стандартным способом (проверка корректности и сохранение значения), плюс внешний флажок одноразового выполнения.

Т.к. объекты нетривиальные, то отладчиком Visual Studio 2010 момент появления неправильного состояния объектов локализовать не удавалось. Как положено опытному разработчику, полез в анализ многопотоковости, выяснения, какой код и каким образом может влиять (так уходит время). После некоторой отладки, все-таки стало ясно, что ошибка возникает только при совпадении нового и старого значения свойства. Если же значения разные, то все нормально. Этот факт сузил поиск до внимательного анализа всех “!=”. А теперь достаточно внимательно посмотреть на код “стандартного” свойства (на C#):

class Foo
{
/* ... */

/// значение свойства
private object m_property = null;

public object Property
{
get
{
/// некоторые проверки и
/// дополнительные манипуляции
return this.m_property;
}
set
{
/// избегаем ненужной работы (Equals не нужен :))
if( this.m_property == value )
return;
/// проверка корректности значения
if( !this.Suitable( value ) )
return;
/// дополнительные манипуляции
/// ....

this.m_property = value;

/// дополнительные манипуляции
/// ....
}
}

/* ... */
}

Далее, понятно, исправляем проверку равности значений. Ура: ошибка найдена и исправлена!

Какие выводы можно сделать из этой ситуации?
1. Штампы поведения – страшная штука. Они настолько въедаются в нашу жизнь и деятельность, что их даже не замечаешь. Смотришь – и не видишь. Потому что “так” а-приори “правильно” (есть хорошая книга на эту тему: Роберт Чалдини “Психология влияния”).
2. 99% ошибок программного кода – очень простые. И только, если очень повезет, можно натолкнуться на действительно интересную и сложную ошибку. Поэтому надо сначала искать что-то очевидно-простое: некорректная проверка входа/выхода из конструкции, не тем значением инициализирована переменная, повторное изменение переменной.

Желаю успехов коллегам в отладке программного кода!


1. Все используемые IP-адреса, имена серверов, компьютеров, доменов, пользователей, являются фиктивными и используются исключительно в демонстрационных целях.
2. Информация приводится «AS IS».

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.