WTF?

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


user posted image

Нет, на самом деле я вижу и отличные проекты. Примером может служить библиотека ALGLIB. Это весьма интересная библиотека, с точки зрения кода. Пишется она на Паскале, а потом транслируется в C++, C#. Помимо прочих разных преимуществ, такой подход позволяет выловить много разных ошибок, так как одна и та же программа собирается компиляторами для разных языков. Впрочем, это отдельная история. Возможно, мы как-нибудь, напишем с автором этой библиотеки совместную заметку.

Такие приятные исключения, пожалуй, ещё больше усиливают диссонанс. Вот представьте мои ощущения. Я беру сложный пакет численного анализа и не нахожу в нем ошибок. Мне радостно за качественный код. Немного только грустно, что такому человеку PVS-Studio не продать. Ну да ладно. Беру проект OpenCOLLADA. Проверяю. 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();
  }
};


Вместо вызова другого конструктора, создается и сразу уничтожается временный объект. А члены класса остаются неинициализированными. Подробнее.

Господи, где те люди, которые, засучив рукава, пишут статьи про 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).

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

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

Comments (5)
ava
ToDDIk | 03.10.2013, 13:52 #
Эмс. это же с хабра.
ava
volatile | 03.10.2013, 17:11 #
Цитата (Thunderbolt @  3.10.2013,  13:50 findReferencedText)
WTF? 

Да глупейшие ошибки в солидных проектах повергают в шок, согласен.
Как-то решил использовать библиотеку длинных чисел GMP/MPFR, хваленую перехваленую, которую чуть ли не НАСА использует, и за пару часов без всяких инструментов нашел 10 тупейших багов.
Нашел бы и больше - дальше просто не стал искать. Дурдом полный в общем.
ava
EgoBrain | 04.10.2013, 02:58 #
Странно что автор статьи не вставлял фейспалмы на пол экрана когда разбирал проект "Сетевой ГТА 3", там что-то вроде было.
Только после этой статья до меня дошла цель автора: пиар этого инструментария PVS-Studio.
Думаю такого рода ошибки прежде всего связанны с чрезмерной..., вобщем авторы кода сильно торопятся,
как наркоманы во время ломки получившие в руки дозняк - нужно поскорее скомпилить и порадовадться результату,
видать плеть за спинами практически не опускается.
ava
xvr | 04.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 значимых ошибок, из которых три относились ко "второй степени серьезности" ("препятствуют выполнению критически важных задач полета").


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

added later:
Цитата (EgoBrain @  4.10.2013,  03:58 findReferencedText)
Думаю такого рода ошибки прежде всего связанны с чрезмерной..., вобщем авторы кода сильно торопятся
Не совсем. Это больше похоже на код человека, который прочел вчера книгу "С для чайников" и что-то про отличия С++ от С и бросился кодировать.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit