Celestia — трехмерный космический симулятор. Симуляция космоса позволяет исследовать нашу вселенную в трех измерениях. Celestia доступна на Windows, Linux и macOS. Проект очень маленький и в нём, с помощью PVS-Studio, обнаруживается совсем небольшое количество дефектов. Однако нам очень хочется уделить ему внимание, так как это популярный образовательный проект, который полезно улучшить.
Кстати, программа используется в популярных фильмах, сериалах и передачах для представления космоса. Что тоже повышает требования к качеству кода.
Введение
На официальном сайте проекта Celestia можно найти его подробное описание. Исходный код проекта размещён на GitHub. Исключив библиотеки и тесты, анализатор проверил 166 .cpp файлов. Проект маленький, но найденные дефекты достаточно интересные.
Для анализа кода использовался статический анализатор кода PVS-Studio. И Celestia, и PVS-Studio являются кроссплатформенными. Для анализа была выбрана платформа Windows. Проект было легко собрать, подтянув зависимости с помощью Vcpkg — менеджера библиотек Microsoft. По отзывам он уступает возможностям Conan, но этой программой тоже было удобно пользоваться.
Обзор программ по астрономии Stellarium, Celestia
Результаты анализа
Предупреждение 1
V501 There are identical sub-expressions to the left and to the right of the ‘
bool operator <(const Mesh::VertexDescription b) < if (a.stride < b.stride) return true; if (b.stride < a.stride) return false; if (a.nAttributes < b.nAttributes) // <= return true; if (b.nAttributes < b.nAttributes) // <= return false; for (uint32_t i = 0; i < a.nAttributes; i++) < if (a.attributes[i] < b.attributes[i]) return true; else if (b.attributes[i] < a.attributes[i]) return false; >return false; >
Как же легко ошибиться при копировании кода. Пишем об этом в каждом обзоре. Видимо, только статический анализ кода способен выручить в этой ситуации.
Программист скопировал условное выражение и не до конца его отредактировал. Правильный вариант, скорее всего, такой:
if (a.nAttributes < b.nAttributes) return true; if (b.nAttributes < a.nAttributes) return false;
Интересное исследование на эту тему: «Зло живёт в функциях сравнения».
Предупреждение 2
V575 The ‘memset’ function processes ‘0’ elements. Inspect the third argument. winmain.cpp 2235
static void BuildScriptsMenu(HMENU menuBar, const fs::path . const DestinationList* destinations = guide->appCore->getDestinations(); Destination* dest = (*destinations)[0]; guide->selectedDest = dest; if (hwnd != NULL destinations != NULL) < . >. >
Указатель destinations разыменовывается на две строки выше, чем сравнивается с NULL. Такой код может потенциально привести к ошибке.
Предупреждение 4
V702 Classes should always be derived from std::exception (and alike) as ‘public’ (no keyword was specified, so compiler defaults it to ‘private’). fs.h 21
Возможности программы Celestia.flv
class filesystem_error : std::system_error < public: filesystem_error(std::error_code ec, const char* msg) : std::system_error(ec, msg) < >>; // filesystem_error
Анализатор обнаружил класс, унаследованный от класса std::exception через модификатор private (заданный по умолчанию). Данное наследование опасно тем, что при непубличном наследовании, при попытке поймать исключение std::exception, оно будет пропущено. Как результат, обработчики исключений ведут себя не так, как задумывалось.
Предупреждение 5
V713 The pointer ‘s’ was utilized in the logical expression before it was verified against nullptr in the same logical expression. winmain.cpp 3031
static char* skipUntilQuote(char* s)
В одном месте условного выражения забыли разыменовать указатель s. Получилось сравнение указателя, а не значения по нему. А это не имеет смысла в данной ситуации.
Предупреждение 6
V773 The function was exited without releasing the ‘vertexShader’ pointer. A memory leak is possible. modelviewwidget.cpp 1517
GLShaderProgram* ModelViewWidget::createShader(const ShaderKey . auto* glShader = new GLShaderProgram(); auto* vertexShader = new GLVertexShader(); if (!vertexShader->compile(vertexShaderSource.toStdString())) < qWarning(«Vertex shader error: %s», vertexShader->log().c_str()); std::cerr . >
При выходе из функции освобождается память по указателю glShader, но не очищается по указателю vertexShader.
Такое же место ниже по коду:
- V773 The function was exited without releasing the ‘fragmentShader’ pointer. A memory leak is possible. modelviewwidget.cpp 1526
V547 Expression ‘!inputFilename.empty()’ is always true. makexindex.cpp 128
int main(int argc, char* argv[]) < if (!parseCommandLine(argc, argv) || inputFilename.empty()) < Usage(); return 1; >istream* inputFile = &cin; if (!inputFilename.empty()) < inputFile = new ifstream(inputFilename, ios::in); if (!inputFile->good()) < cerr > . >
Повторная проверка наличия имени файла. Не является ошибкой, но из-за того, что проверка переменной inputFilename уже есть в начале функции, ниже проверку можно убрать, что сделает код более компактным.
Предупреждение 8
V556 The values of different enum types are compared: switch(ENUM_TYPE_A) < case ENUM_TYPE_B:… >. render.cpp 7457
enum LabelAlignment < AlignCenter, AlignLeft, AlignRight >; enum LabelVerticalAlignment < VerticalAlignCenter, VerticalAlignBottom, VerticalAlignTop, >; struct Annotation < . LabelVerticalAlignment valign : 3; . >; void Renderer::renderAnnotations(. ) < . switch (annotations[i].valign) < case AlignCenter: vOffset = -font[fs]->getHeight() / 2; break; case VerticalAlignTop: vOffset = -font[fs]->getHeight(); break; case VerticalAlignBottom: vOffset = 0; break; > . >
В операторе switch, перепутали значения перечислений. Из-за этого в одном месте сравниваются перечисления разных типов: LabelVerticalAlignment и AlignCenter.
Предупреждение 9
V581 The conditional expressions of the ‘if’ statements situated alongside each other are identical. Check lines: 2844, 2850. shadermanager.cpp 2850
GLVertexShader* ShaderManager::buildParticleVertexShader(const ShaderProperties . if (props.texUsage source if (props.texUsage source . >
Анализатор обнаружил два одинаковых условных выражения подряд. Тут либо допущена ошибка, либо два условия можно объединить в одно, и тем самым упростить код.
Предупреждение 10
V668 There is no sense in testing the ‘dp’ pointer against null, as the memory was allocated using the ‘new’ operator. The exception will be generated in the case of memory allocation error. windatepicker.cpp 625
static LRESULT DatePickerCreate(HWND hwnd, CREATESTRUCT . Model* newModel = GenerateModelNormals(*model, float(smoothAngle * 3.14159265 / 180.0), weldVertices, weldTolerance); . >
Диагностика рекомендательная, но здесь действительно лучше воспользоваться готовой константой для числа Pi из стандартной библиотеки.
Заключение
В последнее время проект развивается силами энтузиастов, но по-прежнему популярен и востребован в учебных программах. В интернете есть тысячи дополнений с разными космическими объектами. Celestia использовалась в фильме «The Day After Tomorrow» и документальном сериале «Through the Wormhole with Morgan Freeman».
Freevi
Celestia – программа для моделирования виртуальной вселенной
19 июня 2011 Serg Написать комментарий К комментариям
Сегодня пойдет речь о довольно необычной программе, которая больше для души, чем работы. Все в девстве смотрели на небо и мечтал как путешествуют в галактике между звездами. Теперь детскую мечту можно воплотить с помощью компьютера, достаточно поставить бесплатную программу Celestia, и можно путешествовать между планетами, звездами и даже галактиками уходя в бесконечные дали от Земли. Увлекающиеся астрономией должны быть в восторге, а для остальных должна стать весьма познавательной и интересной игрушкой.
Установка Celestia до невозможности проста, только стандартный перечень вопросов, с которыми можете автоматически соглашаться и все подтверждать (не забыли лицензионное соглашение). Желающие разве что могут поменять папку, куда будет инсталлироваться приложение.
Запустив программу, сразу получает эффектный вид нашей солнечной системы, только возникает вопрос, а как всем управляться и где обещанные путешествия. Сразу поводим мышью туда/сюда осматриваясь по сторонам, приблизили/удалили колесом скроллинга но остаемся привязанные к одной точке.
Рассказывать все нюансы долго и нудно лучше из главном меню, отправляемся «Справка->Управления программой». От себя могу посоветовать чтоб отправиться в путешествие, выбираем любую звезду или галактику щелкаем мышью и вызываем контекстное меню перейти, дальше думаю сами разберетесь. Как вариант жмем Enter, появляется что-то вроде командной строки,и по буквам набираем нужный объект, снизу будут предлагаться возможные варианты, название нужно набрать полностью со всеми скобками и примечаниями, после чего снова Enter, и для эффектного перелета жмем клавишу «G». Несколько часов интересных исследований и со всем разберетесь.
Настрой что и как именно должно отображается делаем в «Вид->Настройки». Для быстрого перехода между отдельными объектами в выбранной солнечной системе «Навигация->Каталог Солнечной системы… ».
Любое перемещение выполняется с плавной анимацией, можно выбирать точное время, когда ведете наблюдения, за заездами перемещаясь на тысячелетия вперед или назад, своими глазами увидев все значительные астрономические события. Для экскурсий можно создавать сценарии которые будут переносить из одного места в другое с текстовыми комментариями.
А теперь самая сильная сторона Celestia это возможность устанавливать дополнения, под которыми подразумеваться добавления тысячи дополнительных космических объектов и текстур к ним, шикарный набор находиться на сайте http://www.celestiamotherlode.net/. Если чего-то не смогли найти, отправляемся на сайт и добавляем недостающее. В дополнениях даже можно найти планеты из известных фантастических вселенных вроде «Звездные Войны». Некоторые паки собранные энтузиастами занимать до 19 гигабайт на диске, представляете, сколько там всего есть. Только учтите, чем больше дополнений будет установлена, тем дольше программа запускается.
Ставил себе Celestia на компьютер просто ради интереса, будучи полностью уверенным, что это одна из нудных и неинтересных программ связанных с образованием, которая рассчитан на маньяков астрономов. Да с её помощью можно многое узнать, нового для себя но зато снять эффектные галактические кадры, неплохо развлечься, добавляя звезды и планеты из космическими фантастические вселенных таких как «Звездные Войны», «Вавилон-5», и «Стар трек». Работает без ошибок и довольно шустро даже на не самых современных компьютерах. В общем стоит попробовать, но только если будете готовы ставить дополнения, иначе не почувствуете всего шарма программы.
Прекрасно работает как 32-х, так и 64-х битных операционных системах. Программа переведена приблизительно на 30 языков, среди которых есть и русский. Самое интересное язык выбирается автоматически в зависимости от установок операционной системы, и как его вручную поменять так и не нашел как.
Последняя версия на момент написания Celestia 1.6.1
Размер программы: установочный файл 6,69 Мб
Совместимость: Windows Vista и 7, Windows Xp, MacOS, Linux
Источник: freevi.net
Трёхмерный симулятор космоса Celestia + аддон Celestia Origin
Как-то я упоминал в анонсе Stellarium’а о Celestia. Делюсь!
Celestia может использовать Qt, GTK2, SDL2 и OpenGL.
Это скриншот с Qt-версии из репозитория.
Аддон Celestia Origin содержит дополнительные модели, текстуры, скрипты, расширенные каталоги звёзд и других объектов — около 20 Гб данных!
Например, есть текстуры Земли, какой она могла бы выглядеть миллионы лет тому назад.
Скрипты отображают дополнительные интерфейсные элементы управления программой.
На скриншоте они отключены для большей красочности, так как занимают значительное место на экране. 🙂
Установка Celestia в Arch/Artix Linux:
$ pacman -S celestia
Но в Arch Linux программа скомпилирована с использованием gtk2.
Приятного просмотра и использования этой замечательной программы!
Источник: pingvinus.ru