LINUX.ORG.RU
ФорумTalks

Сыграйте в игру: найдите ошибки в известных открытых проектах (для Си/Си++ программистов)

 , , ,


0

1

Авторы анализатора PVS-Studio предлагают программистам проверить свою внимательность и попробовать найти ошибки в фрагментах Си/Си++ кода.

Анализаторы кода работают без устали и умеют находить множество ошибок, которые сложно заметить. Мы отобрали некоторые фрагменты кода, в которых мы выявили ошибки с помощью PVS-Studio.

Тест не предназначен для тестирования глубины знания языка Си++. Для этого есть другие хорошие и интересные тесты. Например, можно рекомендовать этот C++ Quiz. Наш же тест сделан for fun.

Мы часто слышим от людей, что анализатор кода — это бессмысленный инструмент. Не там поставленную скобку или запятую можно найти за 5 секунд. А сложные алгоритмические ошибки анализатор не найдёт. Поэтому, максимум кому полезен инструмент, это студенты.

Мы решили потроллить таких людей. В тестах сделано ограничение по времени. Предлагаем им найти ошибку за тем самые 5 секунд. Хорошо, не 5 секунд, а за минуту. Будет предложено 15 случайно выбранных заданий. За верный ответ насчитывается одно очко, если он дан в течение 1 минуты.

Хотим подчеркнуть, речь идёт не о синтаксических ошибках. Все фрагменты взяты из известных Open-Source проектов, которые успешно компилируются. Рассмотрим пару примеров с ошибками и объясним, как указывать правильный ответ.

Пример первый.

Здесь ошибка выделена красным. При решении задач этого, конечно, не будет.

Программист случайно опечатался и вместо индекса 2 написал 3. При движении курсора мышки над кодом будут подсвечиваться различные слова и цифры. Вы должны навести курсор на число 3 и нажать левую кнопку мыши.

Это будет правильный ответ.

Не всегда можно однозначно указать, где ошибка:

Второй пример.

Размер буфера нужно сравнить с числом 48. Случайно в код затесался лишний оператор sizeof(). В результате, размер буфера сравнивается с размером типа int.

На мой взгляд, ошибкой является оператор «sizeof», и именно на него надо указать мышкой. Однако, не имея перед глазами весь текст программы, можно рассудить так. Оператор 'sizeof' должен был посчитать размер какого-то буфера, но ему случайно подсунули макрос. Ошибкой является использование «SSL3_MASTER_SECRET_LENGTH».

Для таких случаев ответ будет засчитан, как верный, независимо от того, выберете вы «sizeof» или «SSL3_MASTER_SECRET_LENGTH».

Желаем успехов! Вы можете начать игру.

Примечание.

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

Подробности

Перемещено anonymous_incognito из opensource



Последнее исправление: cetjs2 (всего исправлений: 3)

Ответ на: комментарий от kirk_johnson

которые не знают про clang, который тоже умеет статический анализ.

clang даже близко не стоял ни с одной нормальной тулзой, я проверял. Засим разговор окончен.

true_admin ★★★★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Мы (и я в частности) сделали для open-source намного больше, чем здесь присутствующие :)

Можем похвастаться созданием компании, которая показывает рост (сейчас нас 12 человек). А если про открытые проекты, то сейчас в базе содержится 1873 примеров подозрительного кода. Половина это точно ошибки, остальное, как минимум, пахнущий и ненадёжный код.

Такой-то вклад сложно переоценить :D

kirk_johnson ★☆
()
Ответ на: комментарий от Andrey_Karpov_2009

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

true_admin ★★★★★
()

Крутой тест. Особо не вникая, попивая пиффко ответил на 9/15. Затупил на скобочках, ; после if и еще на чем-то.

Reset ★★★★★
()
Ответ на: комментарий от kirk_johnson

В ядро багрепорты слали, многие найденные проблемы потом закрыли патчами.

Reset ★★★★★
()
Ответ на: комментарий от hateyoufeel

Там в базе тыща видов ошибок, большинству ошибок подвержены и «адекватные средства разработки».

Reset ★★★★★
()
Ответ на: комментарий от kirk_johnson

PVS-Studio используют 3.5 русских нищеброда под винду, у которых нет денег на Coverity, но которые не знают про clang, который тоже умеет статический анализ.

Я бы не был столь категоричен. Как раз российские компании почти не покупают. Основные клиенты, это Европа и США. Да, Coverity круче. Но и цены там совсем другие. Мы работаем на «промежуточном» рынке, между бесплатными Clang, CppCheck и дорогими продуктами, такими как Coverity.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Reset

Из тыщи ошибок, которые там есть, многие вызывают лишь желание приложить руку к лицу. Использование memset или сравнение переменной с самой собой, например, никак не являются косяками. С другой стороны, ; не в том месте вполне способен отловить и clang.

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Обычно, если дело идет хорошо, то сказали бы и похвастались, что «У напс уже дофига известных клиентов, все раскупают!»

invy ★★★★★
()
Ответ на: комментарий от hateyoufeel

или сравнение переменной с самой собой, например, никак не являются косяками.

Если здесь нет макроса или функции с побочными эффектами (хотя такой стиль программирования сам по себе проблемный), то зачем это нужно? Строго говоря, статические анализаторы не находят ошибок, потому что все ошибки уже выловил компилятор и если проект компилируется ошибок нет :)

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

зачем это нужно?

> cat nan.c 
#include <stdio.h>
#include <math.h>

int main()
{
    double x = sqrt(-1);
    printf("%d\n", x == x);

    return 0;
}
> clang nan.c -lm -Wall
> ./a.out        
0
hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Да, оказывается это в IEEE прописано даже. Спасибо, не знал или забыл :) Хотя более по душе функция isnan(), но она вроде только в C99.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Да не отвечайте вы на тупой троллинг. Этот малец не приложил список своих патчей в OSS, а пруфы требует с вас. Вы, если я не ошибаюсь, отправляли свои репорты в такие значимые OpenSource-продукты, как Chromium, Linux, Qt, KDE, Gimp и Haiku OS.

Кстати небольшой вопрос: что теперь делать тем людям, которые хотят проверить какой-нибудь OpenSource-проект вашими продуктами и выложить отчёт куда-нибудь (на тот же хабр)? Как закрытие CppCat повлияет на это?

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Andrey_Karpov_2009

Я так понимаю, что это троллинг.

Нет, это был не тролинг.

Так что Вы правы, без статических анализаторов искать подобное весьма непросто.

Ну так я это и хотел сказать. Не понимаю, почему это восприняли как троллинг

sehellion ★★★★★
()
Ответ на: комментарий от EXL

Кстати небольшой вопрос: что теперь делать тем людям, которые хотят проверить какой-нибудь OpenSource-проект вашими продуктами и выложить отчёт куда-нибудь (на тот же хабр)? Как закрытие CppCat повлияет на это?

Никак не повлияет. Напишите нам, расскажите, что и зачем хотите проверить. И с большой вероятностью мы предоставим лицензию на некоторое время. А если ещё кто-то захочет статью про это написать, так ещё и всячески поможем, и оближем.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от hateyoufeel

люди тратят свои время и деньги на вот такие вот чудовищные костыли типа вашего PVS-Studio.

И что, серьёзно, кто-то на это потратился?

rupert ★★★★★
()

Пробежался по квизу. Глаза сломаешь в поисках банальных опечаток в от фонаря выдернутых откуда-то фрагментах ничем непримечательного кода. И это теперь приравнивается к «глубине знания языка Си++»? Адекватность команды разработчиков pvs-studio под вопросом.

rupert ★★★★★
()
Ответ на: комментарий от rupert

И это теперь приравнивается к «глубине знания языка Си++»?

Где ты увидел что-то про глубину?

В самом начале же написано

Авторы анализатора PVS-Studio предлагают программистам проверить свою внимательность

fang
()

Мы решили потроллить

Какими важными делами вы там занимаетесь

fang
()
Ответ на: комментарий от Andrey_Karpov_2009

Что-бы было понятнее предлагаю прочитать вот эту заметку Красивая 64-битная ошибка на языке Си.

Что там такого «красивого»? И GCC и Clang отлично диагностируют всё что можно и нельзя в этой «красивой ошибке»: https://ideone.com/Z9FT4R (а clang ещё больше ошибок выдаёт).

rupert ★★★★★
()
Ответ на: комментарий от rupert

На самом деле, начиная с C99 эту муть с дефолтным int выпилили из языка.

hateyoufeel ★★★★★
()
Ответ на: комментарий от rupert

Да. Продукт сформировался и им с удовольствием пользуются некоторые группы разработчиков. Некоторые компании продлевают лицензию на PVS-Studio уже 4 года. Есть клиенты, которые приобрели Site License для 50 разработчиков. Особенно мы гордимся своей поддержкой. Многие клиенты отмечали её быстроту и качество. Более того, наша поддержка нередко превращает негативно настроенного человека в клиента (пример).

Многие понимают и ценят статический анализ. И готовы тратить на это деньги.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от rupert

Глаза сломаешь в поисках банальных опечаток.

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

в от фонаря выдернутых откуда-то фрагментах ничем непримечательного кода

Я думаю Вы слишком спешили. Если быть чуть внимательнее, то проходя тест можно заметить, что слева выводится название проекта, в котором анализатор PVS-Studio нашел эту ошибку. Код взят из проектов, которые регулярно используются большим количеством людей: Qt, Chromium, OpenMW и т.д.

Andrey_Karpov_2009
() автор топика
class AltOp: public RegExp
{
private:
  RegExp *exp1, *exp2;
  ...
};

uint AltOp::fixedLength()
{
  uint l1 = exp1->fixedLength();
  uint l2 = exp1->fixedLength();

  if (l1 != l2 || l1 == ~0u)
    return ~0;

  return l1;
}

V656 Variables are initialized through the call to the same function. Its probably an error or un-optimized code. Consider inspecting the exp1->fixedLength() expression. actions.cc 391 A trivial misprint. The 'exp2' pointer should have been used to initialize «l2» variable.

Ответ, конечно, правильный, однако рассуждения не убеждают.

Variables are initialized through the call to the same function.

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

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 2)

quiz конечно интересный, но йолки-палки..

bool Matrix4::operator==(const Matrix4& other) const {
    // If the bit patterns are identical, they must be
    // the same matrix. If not, they *might* still have
    // equal elements due to floating point weirdness.
    if (memcmp(this, &other, sizeof(Matrix4) == 0)) {
        return true;
    }

    for (int r = 0; r < 4; ++r) {
        for (int c = 0; c < 4; ++c) {
            if (elt[r][c] != other.elt[r][c]) {
                return false;
            }
        }
    }

    return true;
}

тыкаю на memcmp, пототму что он последний параметром принимает 0, мне говорят INCORRECT, и показывают, что нужно тыкать на ) а причину все равно пишут ту самую. The number of compared elements is calculated by the "sizeof(Matrix4) == 0" expression

хм.

ossa ★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Молодцы

Мы (и я в частности) сделали для open-source намного больше, чем здесь присутствующие :).

Вы молодцы. Ваш «агрессивный маркетинг» густо замешан на помощи свободны проектам. Всё делаете правильно.

Camel ★★★★★
()
Ответ на: Молодцы от Camel

Вы молодцы. Ваш «агрессивный маркетинг» густо замешан на помощи свободны проектам. Всё делаете правильно.

Спасибо.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от lenin386

Конструктивная критика

Помощь хороша тогда, когда о ней просят. Когда о ней не просят, это называется немного по-другому.

Ну хорошо, пусть это будет конструктивной критикой.

Camel ★★★★★
()
Ответ на: комментарий от lenin386

Помощь хороша тогда, когда о ней просят

Чтобы свободные проекты отказывались от багрепортов — это что-то новое.

Когда о ней не просят, это называется немного по-другому.

Если завидуешь, то так прямо и скажи.

fang
()
Ответ на: комментарий от fang

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

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 2)
Ответ на: комментарий от lenin386

Да если бы к этим багрепориам не прилагалось освещение на всех сайтах, до которых эти упыри дотянутся, авторов СПО как криворуких ламеров

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

fang
()
Ответ на: комментарий от fang

Ты по ссылкам-то ходил ?

This error was found in theChromium project by PVS-Studio C/C++ static code analyzer

Даже хороший разработчик может сделать идиотский баг

И это ни разу не повод пиариться на нём всяким упырям.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от lenin386

This error was found in theChromium project by PVS-Studio C/C++ static code analyzer

И что дальше? Где тут назвали авторов проекта «криворукими ламерами» или намекнули на это?

И это ни разу не повод пиариться на нём всяким упырям

Ладно, завидуй дальше

fang
()
Ответ на: комментарий от fang

Где тут назвали авторов проекта «криворукими ламерами» или намекнули на это?

Да не намекнули ни разу, разумеется.

lenin386 ★★★★
()
Ответ на: комментарий от lenin386

И это ни разу не повод пиариться на нём всяким упырям.

А тем временем упыри добрались до Haiku. И жертвы им признательны (см. новость на главной странице :-).

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от lenin386

Помощь хороша тогда, когда о ней просят. Когда о ней не просят, это называется немного по-другому.

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

За такое обычно вкатывают иск о защите деловой репутации, и не выиграть такой суд - это надо хорошо постараться.

Лол. То есть я опубликую, к примеру исследование о какой-нибудь уязвимости в Linux или Windows, то организации и разработчики вправе подать на меня в суд с иском «о защите деловой репутации»? Ты идиот или просто школьник?

Анализатор PVS-Studio даже несмотря на свою проприетарность, помог куче СПО-проектов. А теперь приложи-ка к своему посту список твоих патчей в СПО. Сравним, кто из вас больше помог свободному программному обеспечению.

EXL ★★★★★
()
Ответ на: комментарий от lenin386

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

Стоп, стоп. А как же принцип open-source, что мол каждый смотрит в код, находит ошибки и это делает проект надёжным. Я ведь вроде на форуме людей, которые за открытые исходники, безопасность и что каждый может посмотреть. И что я слышу! :))))

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

Код взят из проектов, которые регулярно используются большим количеством людей: Qt, Chromium, OpenMW и т.д.

Ну и что? В любом проекте можно накопать порядочное количество говна. Получается, что реклама продукта звучит как: «посмотрите, как мы в говне ищем конфетку». Что при этом думает типичный разработчик? В моём проекте нет говна, поэтому мне эта штука, которая может хорошо копаться в говне, не нужна.

Для сравнения, есть ещё один продукт: PC-lint. Какая у них реклама? The Bug of the Month. И ошибки искать интересно и о продукте узнаёшь.

rupert ★★★★★
()
Ответ на: комментарий от rupert

Для сравнения, есть ещё один продукт: PC-lint. Какая у них реклама? The Bug of the Month. И ошибки искать интересно и о продукте узнаёшь.

Да, хороший был ресурс. Жаль прекратили его вести (последняя запись датируется 2012 годом).

Можно сказать, в каком-то виде мы взяли у них эстафету. Вот тест, например, сделали. Статьи пишем, в которых не только рассказываем об ошибках, но и даём советы и тому подобное. Некоторые примеры:

Andrey_Karpov_2009
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.