Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

WTF?

Anna | 24.06.2014 | нет комментариев
PVS-Studio, WTF?
Меня не покидает когнитивный диссонанс. На форумах обсуждаются возвышенные идеи о написании сверх верных классов, кто-то рассказывает, что его план собирается с ключами -Wall -Wextra -pedantic -Weffc . Господи, где все эти достижения науки и техники? Отчего я вижу кругом глупейшие ошибки? Может быть, со мною что-то не так?

Нет, на самом деле я вижу и чудесные планы. Примером может служить библиотека 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;
  }
  ....
}

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

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

WTF

«Доставляют» и другие конструкторы. Скажем, вот это мило:

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

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

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

Господи, где те люди, которые, засучив рукава, пишут статьи про C 11, лямбды, Boost.Asio, share_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. Расположение этих и некоторых других комичных ошибок я выложил вот в этом текстовом файлике. И как неизменно, если будут желающие больше скрупулезно проверить данный план, я готов поделиться ключиком.

Везения и безбажного вам кода!

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB