Исследователь из Института астрофизики Канарских островов (IAC) предложил принципиально новый способ поиска внеземной жизни, ориентируясь на техносигнатуры. Рассказываем, что это такое, как инопланетный разум искали раньше, по какой причине ученые прекратили попытки и почему сейчас самое время возобновить поиски.
Читайте «Хайтек» в
Как искали внеземную жизнь раньше?
Новое начало
- Во-первых, появился проект TESS
18 апреля 2018 году на борту ракеты SpaceX Falcon 9 НАСА запустило спутник для исследования транзитных экзопланет (TESS). Миссия стала следующим шагом в поисках планет за пределами нашей Солнечной системы. В том числе тех, которые могут поддерживать жизнь. В ходе миссии уже обнаружены экзопланеты, которые периодически блокируют часть света от своих звезд-хозяев.
Такой метод поиска экзопланет называет транзитным. TESS обследует 200 000 ярчайших звезд около Солнца в поисках других миров.
За почти три года TESS внес в каталог тысячи планет-кандидатов и увеличил количество известных экзопланет. Несколько из них оказались размером с Землю — в космическом масштабе и по меркам НАСА это те планеты, которые не более чем в два раза больше Земли. Чем больше миссия находит экзопланет, тем больше у нас шансов найти там следы жизни.
Первый Контакт! В фантастике и «реальности». SETI атака.
- Во-вторых, созданы новые телескопы
Принципиально новые телескопы и проекты будущих космических миссий впервые позволят искать биомаркеры, свидетельствующие о жизни на других планетах. Многие эксперты считают вероятным, что в ближайшие годы мы обнаружим внеземную жизнь, хотя, скорее всего, она будет представлена в очень простой форме.
Учитывая настоящий и будущий технический прогресс, появятся новые возможности для поиска техносигнатур. Вот почему НАСА решило снова заняться поисками внеземного разума, воспользовавшись возможностями нынешних и предполагаемых будущих космических обсерваторий.
«Мы не знаем, является ли интеллект чем-то очень распространенным во Вселенной или, наоборот, встречается крайне редко, — объясняет Эктор Сокас-Наварро, исследователь МАК, директор Музея науки и космоса, Музея Тенерифе и первый автор статьи. — По этой причине мы не можем знать, есть ли у этих поисков хоть какие-то шансы на успех. Нет другого выбора, кроме пытаться снова и снова».
«Идея поиска техносигнатур опирается на технологии, которые у нас есть на Земле сегодня, и их развитие в будущем, — отмечает Якоб Хакк-Мисра, соавтор статьи и председатель оргкомитета TechnoClimes 2020. — Это не обязательно означает, что любая внеземная технология должна быть похожа на нашу. Однако представляя наше будущее, мы можем предполагать, какие следы разумной жизни стоит искать».
Читать далее
Источник: hightech.fm
Сообщения от инопланетян? (Программа SETI)
Существует две возможности: либо мы одиноки во Вселенной, либо нет. Обе одинаково ужасны. (с) Артур Чарльз Кларк
Подробнее о проекте
Результаты проверки
Признаюсь, что перед анализом проекта я был в предвкушении того, сколько проблемных мест удастся обнаружить. Но на моё удивление действительно интересных фрагментов кода (проблемных) оказалось не так уж много, что говорит о его качестве.
Тем не менее, подозрительные места были, и некоторые из них я бы хотел рассмотреть.
Для разогрева
Примеры кода в этом разделе нельзя подвести под какую-то одну категорию, как например «указатели» или «циклы», так они имеют разную тематику, но по-своему интересны.
Поэтому предлагаю перейти ближе к делу:
struct SETI_WU_INFO : public track_mem < . int splitter_version; . >; SETI_WU_INFO::SETI_WU_INFO(const workunit . splitter_version=(int)floor(w.group_info->splitter_cfg->version)*0x100; splitter_version+=(int)((w.group_info->splitter_cfg->version)*0x100) 0xff; . >
Предупреждение анализатора: V560 A part of conditional expression is always true: 0xff. seti_header.cpp 96
Подозрительным выглядит оператор », который используется для получения целочисленного значения. Возможно, в данном случае был необходим оператор ‘ . inline float4 rsqrt() const < >inline float4 sqrt() const < >inline float4 recip() const < >. >;
- V591 Non-void function should return a value. x86_float4.h 237
- V591 Non-void function should return a value. x86_float4.h 239
- V591 Non-void function should return a value. x86_float4.h 241
Что это было: задел на будущее или ошибка — сказать сложно, так как никаких комментариев к данному коду не было. Просто имейте ввиду то, что я написал выше.
Но не будем зацикливаться на этом примере, лучше взглянем, что ещё удалось найти.
template std::vector xml_decode_field(const std::string FORCE_FRAME_POINTER; throw seti_error( err, __FILE__, __LINE__, errmsg ); >while (0)
Предупреждение анализатора: V606 Ownerless token ‘0’. analyzefuncs.cpp 212
Сразу хочу сказать, что этот макрос по ходу кода встречался неоднократно. Непонятно, почему бы просто не генерировать исключение. Вместо этого в коде встречается непонятная лексема и присутствует цикл, для которого выполняется только одна итерация. Подход интересный, но к чему такой велосипед — неясно.
Указатели и работа с памятью
Для разнообразия — пример кода с указателями. Как правило, во фрагментах кода, содержащих работу с указателями или адресами, вероятность наступить на грабли порядком возрастает. Поэтому они вызывают больший интерес.
size_t GenChirpFftPairs(. )
Предупреждение анализатора: V595 The ‘ChirpSteps’ pointer was utilized before it was verified against nullptr. Check lines: 138, 166. chirpfft.cpp 138
Анализатор предупреждает о том, что указатель используется до того, как выполняется проверка, на то, является ли он нулевым. Если не удастся выделить память и функция ‘calloc’ вернёт значение ‘NULL’, будет выполнено разыменовывание нулевого указателя, что, как все мы прекрасно знаем, не очень хорошо.
Другой момент заключается в том, что функция ‘free’ вызывается только в том случае, если указатель не равен ‘NULL’. Эта проверка избыточна, так как функция ‘free’ без проблем обрабатывает нулевые указатели.
Другой участок кода с подозрительным использованием функции ‘memset’. Давайте посмотрим:
int ReportTripletEvent(. ) < . static int * inv; if (!inv) inv = (int*)calloc_a(swi.analysis_cfg.triplet_pot_length, sizeof(int), MEM_ALIGN); memset(inv, -1, sizeof(inv)); for (i=0;i. >
Предупреждение анализатора: V579 The memset function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument. analyzereport.cpp 271
Из данного фрагмента кода видно, что сначала выделяется память под массив, после чего его элементы заполняются значением ‘-1’, а после с ними происходит работа. Но вот в функцию ‘memset’ третьим параметром передаётся не размер массива, а размер указателя. Для правильного заполнения массива необходимыми символами третьим аргументом следовало передавать размер буфера.
Циклы
std::string hotpix::update_format() const
Предупреждение анализатора: V621 Consider inspecting the ‘for’ operator. It’s possible that the loop will be executed incorrectly or won’t be executed at all. schema_master.cpp 9535
Ошибка весьма тривиальна. Как все мы знаем, тело цикла ‘for’ выполняется, пока его условное выражение истинно. Здесь же уже на первой итерации условие будет ложным, так что сразу будет осуществлён выход из цикла. Лично я не могу понять, что здесь подразумевалось, но тем не менее тело этого цикла никогда не будет выполняться.
Аналогичный фрагмент кода встретился ещё раз, но в другом методе другого класса:
V621 Consider inspecting the ‘for’ operator. It’s possible that the loop will be executed incorrectly or won’t be executed at all. schema_master.cpp 11633
Не столь прозрачный, но потенциально ошибочный пример:
template std::istream >(std::istream b) < . while (!i.eof()) < i >> tmp; buf+=(tmp+’ ‘); > . >
Предупреждение анализатора: V663 Infinite loop is possible. The ‘cin.eof()’ condition is insufficient to break from the loop. Consider adding the ‘cin.fail()’ function call to the conditional expression. sqlblob.h 58
Так как мы рассматриваем циклы, несложно догадаться, что ошибка — в условии выхода из цикла ‘while’. Хотя многие наверняка не обнаружат ничего подозрительного, так как применяемый здесь метод выглядит вполне стандартным. Но подводный камень есть, иначе этого примера в статье не было бы.
Дело в том, что при возникновении сбоя чтения данных такой проверки будет недостаточно. В таком случае метод ‘eof()’ будет постоянно возвращать ‘false’, как следствие — бесконечный цикл.
Для исправления ошибки необходимо добавить дополнительное условие. Тогда цикл будет выглядеть следующим образом:
while(!i.eof() !i.fail()) < //do something >
Прочие подозрительные места
Аккуратными нужно быть и с битовыми операциями. В ходе анализа встретился участок кода, приводящий к неопределённому поведению:
int seti_analyze (ANALYSIS_STATE int retval=0, i, l=xml_indent_level; . retval = (int)state_file.write(str.c_str(), str.size(), 1); // ancillary data retval = state_file.printf( «%fn» «%dn» «%dn», best_spike->score, best_spike->bin, best_spike->fft_ind); . >
Предупреждение анализатора: V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 450, 452. seti.cpp 452
В данной ситуации тяжело сказать, что подразумевалось или как это необходимо исправить. Но программист, писавший код, возможно, поймёт причину такого использования переменной. Нам же остаётся только удивляться и строить догадки.
- V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 470, 472. seti.cpp 472
- V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 490, 492. seti.cpp 492
- V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 513, 515. seti.cpp 515
- V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 533, 536. seti.cpp 536
- V519 The ‘lReturnValue’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 85, 97. win_util.cpp 97
Напоследок приведу пример, где несколько нерационально используется функция ‘strlen’:
int parse_state_file(ANALYSIS_STATE . while(fgets(p, sizeof(buf)-(int)strlen(buf), state_file)) < if (xml_match_tag(buf, «