• Заменить Object на var: что может пойти не так?
    +1

    Всё же по-моему, от нулла больше реальных ошибок, чем от дженериков со стиранием.

  • Заменить Object на var: что может пойти не так?
    +1

    А, кстати да. Я и забыл, что я сам это сделал.


    List.remove тоже поддержал (добавил требование, что индекс должен быть от 0 до длины списка), хотя здесь простой пример, всё известно заранее. Не факт, что в реальной жизни пригодится.

  • Заменить Object на var: что может пойти не так?
    0

    Про метод-референс мы говорим, что а-та-та будет:



    Ну сравнение c new Integer() понятно что подозрительное:



    x = (Integer)null — дело святое (конечно, варнинг исчезает, если тип Object):



    Кое-что из остального поддержать можно, но не факт, что нужно...

  • «Гений, миллиардер, филантроп, мой малой»: ни один талант не пропадет
    0

    Может быть в Чокурдах до сих пор так же дела обстоят и всё дело не в другом времени, а в другом месте?

  • Заменить Object на var: что может пойти не так?
    +3

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

  • Управление зависимостями в многомодульном проекте на градл
    +1

    Лучше всего написать в саппорт. Я не специалист по гредлу.

  • Только что вышла Java 13. ZGC начал делиться памятью, CDS сам запоминает классы, и другие чудеса техники
    0
  • Только что вышла Java 13. ZGC начал делиться памятью, CDS сам запоминает классы, и другие чудеса техники
    0

    В тестах у нас их полно. Мне кажется, в тестах они наиболее оправданны. Некоторые только ради них пишут тест на груви или Котлине.

  • Только что вышла Java 13. ZGC начал делиться памятью, CDS сам запоминает классы, и другие чудеса техники
    +1

    Ну свежие апишечки он в конце перечислил, а это не часть джепов. Просто прямо скажем ничего нового в этой вашей джаве 13 не появилось :-)

  • Тысячи вещей, которые в Java стоило бы поправить с первой версии: большое интервью с Сергеем Куксенко из Oracle
    0
    Говорит: «Блин, ну что такое, я вот всё сделал, выложил, никто не ревьюит». Ну да, никто не ревьюит. Сейчас июль, половина джавовского офиса в отпусках. Вот выйдут из отпусков и проревьюят.

    Уже сентябрь кончается, а воз и ныне там.

  • Только что вышла Java 13. ZGC начал делиться памятью, CDS сам запоминает классы, и другие чудеса техники
    0
    Возможно, кто-то (lany, ау!) сможет продолжить эту работу

    Вон Саймон уже написал.

  • Когда 'a' не равно 'а'. По следам одного взлома
    +4

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

  • И всё же C — низкоуровневый язык
    0

    Насчёт джавы вы неправы. По ссылке по сути способы с помощью программы на Java сгенерировать ассемблерный код, а потом результат слинковать динамически с текущим рантаймом. Если у языка имеется интероп а нативным кодом, то такую конструкцию построить всегда можно, но это не является ассемблерный вставкой само по себе. Да и интероп у джавы довольно поганенький.

  • IT-фестиваль TechTrain 2019: как JUG.ru, JUGNsk и JUG.MSK участвовали в нём
    +4

    Некогда по конфам разъезжать, надо баги фиксить, вон их сколько!

  • IT-фестиваль TechTrain 2019: как JUG.ru, JUGNsk и JUG.MSK участвовали в нём
    +2
    Найдите 2 ошибки: class Hello { void main() { System.out.println(“Hello, world”); } }

    Простая задачка. Первая ошибка — это ссылка на необъявленный символ “Hello, а вторая — ссылка на необъявленный символ world”. Других ошибок нет. Вот и компилятор со мной согласен:


    Hello.java:1: error: cannot find symbol
    class Hello { void main() { System.out.println(“Hello, world”); } }
                                                   ^
      symbol:   variable “Hello
      location: class Hello
    Hello.java:1: error: cannot find symbol
    class Hello { void main() { System.out.println(“Hello, world”); } }
                                                             ^
      symbol:   variable world”
      location: class Hello
    2 errors
  • PVS-Studio в гостях у Apache Hive
    0

    divideUnsignedLong — совершенно точно не ошибка. Это низкоуровневый метод, реализующий деление переменных типа long, интерпретированных как беззнаковые. Если в этот метод передадут divisor = 0, то упасть с "ArithmeticException: / by zero" — самое логичное поведение, этот случай не надо рассматривать специально, добавляя лишние ветки в низкоуровневый код.

  • Зачем нужны дженерики в Go?
    +1

    Ещё не забудьте бинарный сдвиг >>, который должен закрывать вложенный дженерик. В старых плюсах обязательно было пробел ставить в середине.

  • Отчёт с Java Virtual Machine Language Summit 2019
    +1
    Я не знаю точно, по каким критериям отбирают. Знаю, что некоторые компании пытаются заслать больше участников, но их ограничивают. Нас пока не выгоняли :-)
  • PVS-Studio хотел, но не смог найти баги в robots.txt
    +39

    Оказывается, из ничего тоже можно сделать статью на Хабр!

  • Госдума планирует повысить штраф за хранение персональных данных россиян вне России до 18 млн рублей
    +1
    Думаю, если вы покупаете авиабилеты зарубежной авиакомпании или бронируете отель за рубежом, практически наверняка имя, дата рождения и номер паспорта осядут в каких-нибудь зарубежных базах данных.
  • Стажировка в JetBrains и как мне почти удалось попасть на неё
    –7
    > Так почему же вы ведете себя так эгоистично? 16 ответов, это не тысяча, с вашими руками ничего не сделается, не так ли?

    Уговорили, больше вообще студентов брать не буду. Никто не заставляет, и эгоистом не прослыву.
  • Стажировка в JetBrains и как мне почти удалось попасть на неё
    +5
    Давайте поясню, как человек изнутри.

    Во-первых, стажёров на летнюю практику набирает не JetBrains, а JetBrains Research. Это отдельная организация (хоть и финансируемая JetBrains) со своей структурой. HR-отдел JetBrains совершенно не занимается стажировками. Во-вторых, стажёров набирают конкретные менторы. То есть любой штатный сотрудник JetBrains имеет право объявить задачу на стажировку и объявить свой собственный способ отбора студента или студентов на эту задачу. Там есть некоторые ограничения (например, сперва идёт тестовое задание, а потом собеседование), но в целом этот один человек всё решает: и как формулировать задание, и по каким критериям его проверять, и кого звать на собеседование, и кого в итоге пригласить на стажировку. Студент, желающий проходить стажировку, подаётся именно на конкретный проект. Может податься на 2-3 проекта, но на каждом будет своё тестовое задание и свой ментор. Важно то что в итоге на каждом проекте место обычно одно, больше — редко.

    К примеру, в прошлом году я брал стажёра. Я дал одну задачу, указав, что решение обязательно должно быть на Java. Мне прислали 16 решений, шестерых я пригласил на собеседование и одного в итоге взял. Я не уверен, высылал ли я каждому из десяти не прошедших на собеседование мотивированный отказ, хотя у меня есть заметки по каждому решению. Но если бы меня спросили, я бы, конечно, объяснил недостатки решения. Пятерым не прошедшим собеседование я тоже никак не мотивировал отказ. В принципе как тут мотивируешь? Они все молодцы, неплохо справились с тестовым заданием, показали довольно приличный для студента уровень знаний, но нашёлся среди них человек, который показал более высокий уровень знаний и опыт. Это же не экзамен, а соревнование, позиция всего одна.

    Я бы поостерёгся разрешать писать на любом языке из top-50. Когда присылают 16 решений, их будет очень сложно сравнить. Если язык мне совсем незнаком, мне придётся разбираться, как это скомпилировать и запустить. Если я не смогу в итоге запустить, это я корявый, не ту версию компилятора поставил, или это решение корявое? Могу ли я оценить качество кода на незнакомом мне языке? Если в итоге мой проект на Java, а человек демонстрирует уверенное знание PHP, как я пойму, насколько он хорошо будет писать на Java? Мне кажется, что ограничить язык (а лучше и версию) разумно. Но тут каждому ментору виднее, конечно.
  • Математики обнаружили идеальный способ перемножения чисел
    +1
    Ну а что, «Карацуба» звучит вполне по-японски.
  • Excelsior JET прекращает разработку своего AOT-компилятора после 18 лет работы
    +9
    Мы в JetBrains сами в шоке.
  • Длинные имена слишком длинные
    0
    Почему вы отождествляете пакет и неймспейс? Я вот утверждаю, что класс ближе к понятию неймспейс, чем пакет, потому что как и в C++ в классе могут содержаться функции (статические методы), константы (статические поля) и классы (статические вложенные). А в пакете могут быть только классы. Например, в C++ есть std::sprintf, который можно не квалифицировать, если написать using. В Java есть похожий метод java.lang.String::format. Его тоже можно не квалифицировать, используя import static. Но так мало кто делает, все используют квалификатор (пусть и неполный) String.format.
  • Длинные имена слишком длинные
    0

    Интересно, часто вы видели в джаве out.println вместо System.out.println со статическим импортом System.out? Ближайший аналог неймспейсов в джаве — это именно статические импорты.

  • Находим баги в LLVM 8 с помощью анализатора PVS-Studio
    0

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

  • Фибоначчи на собеседовании
    0

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

  • Фибоначчи на собеседовании
    –2

    Интересно, сколько раз на Хабре были числа Фибоначчи на матрицах? Раз пять я, наверно, видел…

  • Анализ кода CUBA Platform с помощью PVS-Studio
    +3
    Это вы, похоже, издеваетесь. Давайте в пустом проекте подчеркнём и напишем «в этом проекте в будущем возможны ошибки». Любой код можно испортить так, чтобы там была ошибка в будущем.
  • Анализ кода CUBA Platform с помощью PVS-Studio
    +2
    Вот когда закомментирует, тогда и надо выдавать предупреждение. А для чистоты надо на Stream API переписать, что авторы кода уже и сделали.
  • Анализ кода CUBA Platform с помощью PVS-Studio
    +2

    У нас можно аннотировать контракты через действие Edit method contract, и они сохраняются в специальные XML-ки. Их можно как коммитить в VCS, так и деплоить в бинарный репозиторий и подкачивать вместе с библиотекой. Вот тут можно почитать про внешние аннотации, а вот тут конкретно про контракты.


    К сожалению, такой контракт как у isNotEmpty целиком не опишешь внешней аннотацией, можно только null -> false написать, но полностью поведение метода не специфицируешь. Такие методы мы можем захардкодить при необходимости (внутренний язык контрактов богаче, чем опубликованный для всех). Есть предложение расширить общий язык контрактов, чтобы можно было писать (param1 != null && param1.length() > 0) -> true; () -> false, но никаких обещаний, будет ли это сделано, когда и в какой форме.

  • Анализ кода CUBA Platform с помощью PVS-Studio
    +3

    Интересно, кстати, это вы вручную преаннотировали org.apache.commons.lang3.StringUtils.isNotEmpty? Вряд ли у вас такой крутой межпроцедурный анализ :-)

  • Анализ кода CUBA Platform с помощью PVS-Studio
    +5

    Да, вам работать и работать ещё над джавой, даже в статье хватает ложных предупреждений, а вы ведь явно отбирали что поместить в статью.


      StringBuilder orderBy = new StringBuilder();
      ....
      if (orderBy.length() > 0) {
          orderBy.delete(orderBy.length() - 2, orderBy.length());
          orderBy.insert(0, " order by ");
      }

    Сразу же видна разница в экспертизе :-) Я себе мгновенно представил, что в опущенном коде происходит: там в цикле что-то дописывается в StringBuilder, и в конец приписывается ", ". И так и оказалось! В этом StringBuilder никогда не может быть одного символа. Либо ноль (если в цикл ни разу не зашли), либо не меньше двух (потому что как минимум одна запятая с пробелом). Вы можете сколько угодно говорить, что код выглядит опасно, ненадёжно и т. д., но это чистый false-positive.


    @Override
    public boolean handle(ErrorEvent event, App app) {
      Throwable t = event.getThrowable();
     ..
      return true;

    Хвастаетесь же, что у вас по десять исключений в каждой инспекции :-) Этот метод реализует метод интерфейса. В этом случае он действует в соответствии с документацией интерфейса: всегда возвращает true, сигнализируя о том, что исключение всегда обработано. В данном случае это не ошибка. Не стоит выдавать это предупреждение для реализаций интерфейсов.


    public <T> T getSingleResultFromCache(QueryKey queryKey, List<View> views) {
      ....
      for (Object id : queryResult.getResult()) {
        return (T) em.find(metaClass.getJavaClass(), id, views.toArray(....));
      }
      ....
    }

    Для циклов for-each это может быть спорный, но вполне используемый паттерн в джаве. Аналогичный код без цикла будет:


      Iterator<?> it = queryResult.getResult().iterator();
      if (it.hasNext()) {
        Object id = it.next();
        return (T) em.find(metaClass.getJavaClass(), id, views.toArray(....));
      }

    Итог: две дополнительных строчки и дополнительная переменная в скоупе. И ради чего? Мы по умолчанию в данном случае предупреждение не выдаём (хотя опция есть выдавать), потому что тех, кто так пишет, можно понять. Во всех остальных типах циклов кроме for-each предупреждение выдаётся.


    Анализатор обнаружил ситуацию, когда сравнение классов осуществляется по имени. Такое сравнение является некорректным, т.к., согласно спецификации, JVM классы имеют уникальное имя только внутри пакета. Это может стать причиной некорректного сравнения и выполнения не того кода, который планировался.

    Это бла-бла совершенно не относится к данному случаю. Это совершенно нормальная ситуация: там сравнение с каким-то названием свойства. Именно с названием, которое может из какого-нибудь XML приходит или ещё откуда-то. Как в данной ситуации сравнить с конкретным классом, загруженным конкретным загрузчиком классов? Сериализовать класс-лоадер в XML? Ну-ну. В бизнес-логике это вполне частый случай, использовать простое имя класса в качестве имени какого-то свойства. Возможно, есть отдельный тест, который убеждается, что в системе нет двух классов с одинаковым именем, объявленных как MetaProperty. В общем, мусорное предупреждение.




    Однако есть и весьма вкусные предупреждения. Статью плюсанул. Работайте дальше.

  • IntelliJ IDEA, ReSharper, SonarLint и SonarQube находят те же ошибки, что и PVS-Studio — ну и зачем нам PVS-Studio?
    +1
    Ценность статического анализа кода, ценность его диагностик не в том, где выдавать ошибку. А в том, где ее НЕ выдавать. На каждую из наших диагностик у нас есть 10, 20, а то и больше исключений, когда срабатывать не надо.

    Звучит так будто конкуренты этого не делают. А это, разумеется, не так. И насчёт 10 исключений в каждой диагностике вы, конечно, привираете. Есть простые кейсы, где пара граничных случаев всё описывает.

  • Понимание джойнов сломано. Это точно не пересечение кругов, честно
    +2

    Думал, это перевод старой статьи Лукаса. Оказалось, что нет.

  • GitHub полностью «удалил» репозиторий утилиты для обхода блокировок и весь аккаунт создателя
    +3
    Кажется, вы не дочитали ни моё сообщение до конца, ни то сообщение, на которое я отвечал. Я где-то говорил, что надо что-то запрещать?
  • GitHub полностью «удалил» репозиторий утилиты для обхода блокировок и весь аккаунт создателя
    +10
    Ваша позиция понятна, но психология человека не такая простая вещь и человек не всегда рационален. Я, например, по себе знаю, что просмотр видео с какой-нибудь адской расчленёнкой проникает в мой мозг глубже, чем я хотел бы, и меняет умственную деятельность в направлении, которое мне не нравится. При этом этот процесс слабо поддаётся контролю. Я не могу просто рационально воспринять эту информацию в виде «ок, принято, так в жизни бывает, надо быть к такому готовым, поступать так как эти люди — плохо». Появляются всякие эмоции, ненависть, отвращение и т. д., которые потом препятствуют нормальной жизнедеятельности и я не могу их быстро подавить. Вероятно это оставляет долговременный след в голове, который мне там не нужен. Вообще стоит особо щепетильно относиться к тому, что складываешь в голову, оттуда не так-то просто удалять файлы.

    Во всяком случае я пришёл к выводу, что для моего мозга просмотр подобных видеоматериалов приносит больше вреда чем пользы, и лучше их избегать. Лучше действительно почитать чью-нибудь заметку с текстовым описанием. Есть шанс, что в заметке что-то переврано (хотя если это реддит, там будет миллион комментариев, где автора ткнут носом). Есть шанс, что у меня сложится искажённое восприятие действительности. Взамен я не получаю трудногасимого эмоционального фона в голове. Я считаю этот обмен выгодным. Моё неправильное мнение о такой проблеме вряд ли как-то повлияет на окружающий мир. А если я начну без причины грубить окружающим, только потому что до этого посмотрел какую-то дрянь, вреда миру будет больше.

    Я полагаю, что не на меня одного подобные вещи воздействуют негативно, хотя готов принять, что есть люди, которые не подвержены такому влиянию. При этом жизненный опыт подсказывает, что очень мало людей критически анализируют то что происходит в их голове. Я могу признать, что для меня гадкие видеозаписи вредны. Другой человек не признает, а с радостью посмотрит, и трудно предсказать, что у него после этого перещёлкнет в мозгу. Поэтому я бы не стал всем подряд показывать всё подряд. Вы же не запускаете любые исполняемые файлы из интернета на всех подряд компьютерах.
  • Как мы в IntelliJ IDEA ищем лямбда-выражения
    0
    Ведь тогда у неё будет точно ограниченный список файлов для проверки и индексация должна проходить быстрее для случаев, когда в пакете 20 классов, а включено всего 4.

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

  • Топ 10 ошибок в C++ проектах за 2018 год
    0

    Почему же пришлось так долго разбираться с этой проблемой?