Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > WTF?


Автор: Thunderbolt 3.10.2013, 13:50
Меня не покидает когнитивный диссонанс. На форумах обсуждаются возвышенные идеи о написании сверх надежных классов, кто-то рассказывает, что его проект собирается с ключами -Wall -Wextra -pedantic -Weffc++. Господи, где все эти достижения науки и техники? Почему я вижу кругом глупейшие ошибки? Может быть, со мной что-то не так?


user posted image

Нет, на самом деле я вижу и отличные проекты. Примером может служить библиотека http://www.viva64.com/go.php?url=1304. Это весьма интересная библиотека, с точки зрения кода. Пишется она на Паскале, а потом транслируется в C++, C#. Помимо прочих разных преимуществ, такой подход позволяет выловить много разных ошибок, так как одна и та же программа собирается компиляторами для разных языков. Впрочем, это отдельная история. Возможно, мы как-нибудь, напишем с автором этой библиотеки совместную заметку.

Такие приятные исключения, пожалуй, ещё больше усиливают диссонанс. Вот представьте мои ощущения. Я беру сложный пакет численного анализа и не нахожу в нем ошибок. Мне радостно за качественный код. Немного только грустно, что такому человеку PVS-Studio не продать. Ну да ладно. Беру проект http://www.viva64.com/go.php?url=1305. Проверяю. WTF? Других слов я подобрать не могу. Как вам такие конструкторы?

Код
struct short2
{
  short values[2];
  short2(short s1, short s2)
  {
    values[0] = s1;
    values[2] = s2;
  }
  ....
};

struct double2
{
  double values[2];
  double2( double d1, double d2)
  {
    values[0]=d1;
    values[0]=d2;
  }
  ....
}


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

Прости читатель, не могу удержаться от картинки. Она очень точно передает мои эмоции.


user posted image

"Доставляют" и другие конструкторы. Например, вот это мило:

Код
struct ParserString : public UnionString
{
  ParserString()
  {
    UnionString::str = 0;
    UnionString::length = 0;
  }

  ParserString(const int& val)
  {
    ParserString();
  }
};


Вместо вызова другого конструктора, создается и сразу уничтожается временный объект. А члены класса остаются неинициализированными. http://www.viva64.com/ru/b/0127/.

Господи, где те люди, которые, засучив рукава, пишут статьи про C++11, лямбды, Boost.Asio, shared_ptr, constexpr, LINQ. Почему я вижу в коде:

Код
struct ObjectGroups{
  componentList objectGrpCompList;
  int objectGroupId;
  short objectGrpColor;
  void write(FILE* file) const;
}* objectGroups;

void write(FILE* file) const
{
  size_t size = sizeof(objectGroups)/sizeof(ObjectGroups);
  for(size_t i=0; i<size; ++i)
  {
    objectGroups[i].write(file);
    if(i+1<size) fprintf(file," ");
  }
}


Поделили размер указателя на размер структуры и получили 0. Что вообще здесь хотели сделать? WTF?

Впрочем, когда даже понятно, что и как хотели записать в файл, от этого не легче. 

Код
void write(FILE* file) const
{
  fprintf(file,"%i %i %i %i ",
    sDivisionCount, tDivisionCount, uDivisionCount, pointCount);
  size_t size = pointCount*3;
  for(size_t i; i<size; ++i)
  {
    fprintf(file, "%f", points[i]);
    if(i+1<size) fprintf(file, " ");
  }
}


Если не заметили баг, то я подскажу. Переменная 'i' не инициализируется:  for(size_t i; i<size; ++i).

Извините, что поделился всем этим с вами. Мне так легче. Заодно, я естественно скажу, что эти ошибки были найдены с помощью статического анализатора кода http://www.viva64.com/ru/pvs-studio/. Расположение этих и некоторых других забавных ошибок я выложил вот в этом http://www.viva64.com/external-pictures/txt/OpenCOLLADA-selected.txt. И как всегда, если будут желающие более тщательно проверить этот проект, я готов поделиться ключиком.

Удачи и безбажного вам кода!


Автор: ToDDIk 3.10.2013, 13:52
Эмс. это же с хабра.
http://habrahabr.ru/company/pvs-studio/blog/195928/

Извиняюсь.  вижу, что один автор =)

Автор: volatile 3.10.2013, 17:11
Цитата(Thunderbolt @  3.10.2013,  13:50 Найти цитируемый пост)
WTF? 

Да глупейшие ошибки в солидных проектах повергают в шок, согласен.
Как-то решил использовать библиотеку длинных чисел GMP/MPFR, хваленую перехваленую, которую чуть ли не НАСА использует, и за пару часов без всяких инструментов нашел 10 тупейших багов.
Нашел бы и больше - дальше просто не стал искать. Дурдом полный в общем.

Автор: EgoBrain 4.10.2013, 02:58
Странно что автор статьи не вставлял фейспалмы на пол экрана когда разбирал проект "Сетевой ГТА 3", там что-то вроде было.
Только после этой статья до меня дошла цель автора: пиар этого инструментария PVS-Studio.
Думаю такого рода ошибки прежде всего связанны с чрезмерной..., вобщем авторы кода сильно торопятся,
как наркоманы во время ломки получившие в руки дозняк - нужно поскорее скомпилить и порадовадться результату,
видать плеть за спинами практически не опускается.

Автор: xvr 4.10.2013, 15:32
Ошибки бывают всегда, таже там, где все тщательнейшим образом тестируют (и постоянно). Вот пара цитат из моей подборки 'всяких разных багов'

Цитата

Исследования British Royal Signals and Radar Establishment 
В конце 80-х гг. такая влиятельная в оборонных кругах организация как British Royal Signals and Radar Establishment сделала попытку оценки распространенности дефектов в ПО, написанном для ряда очень ответственных систем. Оказалось, что "до 10% программных модулей и отдельных функций не соответствуют спецификациям в одном или нескольких режимах работы" [7]. Такого рода отклонения были обнаружены даже в ПО, прошедшем полный цикл всестороннего тестирования. Хотя большинство обнаруженных ошибок были признаны слишком незначительными, чтобы вызвать сколь-либо серьезные последствия, все же 5% функций могли оказывать разного рода значимое негативное воздействие на поведение всей системы. Примечательно, что среди прочего авторы исследования особо упомянули выявленную в одном из модулей неназванной системы потенциальную возможность переполнения в целой арифметике, что могло привести к выдаче команды приводу повернуть некую установку не направо (как следовало), а налево. Достаточно предположить, что речь в ПО шла об управлении ориентацией пусковой ракетной установки, чтобы представить возможные последствия.


Цитата

Исследования NASA по программе Shuttle
NASA инвестировала огромные средства и ресурсы в верификацию и сопровождение программного обеспечения для космических кораблей Shuttle. Несмотря на это, за 10-летие с 1980 г. - времени начала использования ПО - выявлено 16 ошибок "первой степени серьезности" (способных привести к "потере корабля и/или экипажа"). Восемь из этих ошибок не были обнаружены своевременно и присутствовали в коде во время полетов, хотя, к счастью, без последствий. Зато во время полетов были задокументированы проблемы, возникшие от проявившихся 12 значимых ошибок, из которых три относились ко "второй степени серьезности" ("препятствуют выполнению критически важных задач полета").


Автор: bsa 10.10.2013, 11:57
EgoBrain, скажу честно - это очень эффективный и полезный способ пиара. Не спроста его посты не блокируются модераторами  smile

Добавлено через 1 минуту и 47 секунд
Цитата(EgoBrain @  4.10.2013,  03:58 Найти цитируемый пост)
Думаю такого рода ошибки прежде всего связанны с чрезмерной..., вобщем авторы кода сильно торопятся
Не совсем. Это больше похоже на код человека, который прочел вчера книгу "С для чайников" и что-то про отличия С++ от С и бросился кодировать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)