Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Вечное сияние чистого Copy-Paste

Вечное сияние чистого Copy-Paste

22 Янв 2020

Давайте сегодня вспомним о старой доброй статье "Эффект последней строки", написанной более 5 лет назад. Время идёт, но ничего не меняется. В этом нет ничего удивительного. Copy-Paste всё также жесток и беспощаден. Однако, за годы у нашего блога появилось много новых читателей, которые могут быть не знакомы с упомянутой статьёй. Так что сейчас будет минутка воспоминаний и немного дополнений.

0708_Eternal_Sunshine_of_the_Spotless_CopyPaste_ru/image1.png

Сегодня я встретил упоминание статьи "Эффект последней строки" в твите от Jason Turner. Как видим, тема Copy-Paste жива и продолжает вызывать обсуждения. Поэтому я решил, что стоит стряхнуть пыль с этой публикации и напомнить о ней. Уверен, многие не читали эту старую статью или забыли о ней. А ведь она весьма интересна и забавна.

Суть в следующем. Люди тяготеют допустить ошибку в конце однообразных операций, так как теряют внимание. Одним из таких действий является написание кода с помощью Copy-Paste.

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

Именно эта закономерность с соответствующими примерами и описана в статье "Эффект последней строки".

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

К сожалению, статья писалась, когда анализатор PVS-Studio ещё не умел анализировать C# и Java проекты. Поэтому все приведённые в статье ошибки относятся к языку C или C++.

Сейчас я бы смог привести аналогичные примеры, относящиеся и к другим языкам. Проблематика Copy-Paste универсальна и проявляет везде себя одинаково. Чтобы не быть голословным, приведу по одному примеру для C# и Java.

Пример ошибки, найденной нами в C# проекте AWS SDK for .NET.

if (
  (this.token == JsonToken.ObjectEnd ||
  this.token == JsonToken.ArrayEnd ||
  this.token == JsonToken.String ||    // <=
  this.token == JsonToken.Boolean ||
  this.token == JsonToken.Double ||
  this.token == JsonToken.Int ||
  this.token == JsonToken.UInt ||
  this.token == JsonToken.Long ||
  this.token == JsonToken.ULong ||
  this.token == JsonToken.Null ||
  this.token == JsonToken.String       // <=
  ))
{
  ....
}

Пример ошибки, найденной нами в Java проекте Elasticsearch.

for (int i = 0; i < values.length; i++) {
    if (values[i] == null) continue;
    if (values[i] instanceof String) continue;
    if (values[i] instanceof Text) continue;
    if (values[i] instanceof Long) continue;
    if (values[i] instanceof Integer) continue;
    if (values[i] instanceof Short) continue;
    if (values[i] instanceof Byte) continue;
    if (values[i] instanceof Double) continue;
    if (values[i] instanceof Float) continue;
    if (values[i] instanceof Boolean) continue;   // <=
    if (values[i] instanceof Boolean) continue;   // <=
    throw new IllegalArgumentException(....);
}

Как видите, везде всё одно и то же :). Удивляться этому не приходится, так как опечатки и проблемы неаккуратного Copy-Paste почти не зависят от выбранного языка.

Кстати, тем, кто хочет глубже погрузиться в обсуждаемую тему, предлагаю следующую исследовательскую статью, написанную уже коллективом авторов: "Объяснение эффекта последней строки".

Что теперь делать с этим знанием? Хороший вопрос. У меня есть три соображения:

  • Знайте про этот эффект и расскажите другим. Зная про него, вы станете более аккуратным, заканчивая однотипную работу по написанию кода. Знание - сила!
  • Не ленимся писать функции, шаблонные функции или лямбда-выражения, чтобы сократить дублирование кода. А вот макросы писать не надо. Макросы, это зло.
  • Внедрите регулярное использование статического анализатора PVS-Studio, который очень хорошо находит подобные ошибки.
Популярные статьи по теме
Насколько хорошо защищены ваши пароли? Проверка проекта Bitwarden

Дата: 13 Май 2022

Автор: Никита Паневин

Bitwarden – менеджер паролей с открытым исходным кодом. Это программное обеспечение помогает генерировать уникальные пароли и управлять ими. Получится ли у анализатора PVS-Studio отыскать ошибки в та…
Зачем разработчикам игр на Unity использовать статический анализ?

Дата: 11 Май 2022

Автор: Артём Ровенский

С годами стоимость создания игр стала больше, вырос их масштаб, а следовательно, и их кодовая база. Разработчикам становится всё сложнее уследить за ошибками. А забагованная игра влечёт финансовые и …
Эволюция PVS-Studio: анализ потока данных для связанных переменных

Дата: 28 Апр 2022

Автор: Никита Липилин

Связанные переменные – одна из главных проблем статического анализа. Данная статья посвящена разбору этой темы и рассказу о том, как разработчики PVS-Studio сражаются с ложными срабатываниями, появив…
Зачем нужен статический анализ? Разбираем на примере ошибки из Akka.NET

Дата: 25 Апр 2022

Автор: Сергей Васильев

"Статический анализ нужно использовать регулярно, а не только перед релизами... Чем раньше найдена ошибка, тем дешевле её исправление..." – вы уже слышали это 100 раз. Сегодня ещё раз ответим на вопр…
Атака Trojan Source: скрытые уязвимости

Дата: 15 Апр 2022

Автор: Гость

Мы представляем новый тип атаки для внедрения в исходный код вредоносных изменений, по-разному выглядящих для компилятора и человека. Такая атака эксплуатирует тонкости стандартов кодирования символо…

Комментарии (0)

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