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

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

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

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

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

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
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, который очень хорошо находит подобные ошибки.
Популярные статьи по теме
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14 Апр 2016

Автор: Андрей Карпов

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…

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

Следующие комментарии

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