В Comodo соискателям ебут мозги, предлагая за два дня написать антивирус на C++
Добрый день, ебаная редакция и ебаные читатели. Хочу рассказать вам необычную историю, которая произошла с моим товарищем. Я, так уж получилось, жил по соседству и мог воочию наблюдать за происходящим.
Disclaimer
Впереди вас ожидают теоретические рассуждения, немного C++ кода и алгоритмов. В общем, статья получилась с техничесмким уклоном. Особо неокрепшим умам просьба воздержаться от прочтения. Весь код, упомятый здесь, не приаттачен, поскольку не вызовет интереса у широкой аудитории и не несёт какой-либо практической ценности
отдельно от статьи.
Итак, поехали. Один мой коллега, так уж вышло, начал поиски работы по вакансии Middle/Senior C++ developer. Да-да, есть жизнь за пределами ангуляров. В какой-то момент к нему постучалась hr и предложила “интересную” вакансию в Comodo. Для тех, кто вообще «не в кугхсе», компания разрабатывает продукт Comodo Internet Security и достаточно
известна в мире кибербезопасности (не так известна, как ProtectMasters, но всё-таки):
https://ru.wikipedia.org/wiki/Comodo
И чуть больше про сам продукт можно найти здесь:
https://ru.wikipedia.org/wiki/Comodo_Internet_Security
У компании есть офис в Киеве, куда, собственно, она и хотела бы нанять ещё девелопера (или нескольких). Всё складывалось вполне обычно, но ВНЕЗАПНО закрутилось с новой силой.
Описание вакансии и требований
Для начала ознакомимся с описанием вакансии и требованиями к кандидату:
https://www.work.ua/ua/jobs/2118094/
http://telegra.ph/MiddleSenior-C-Developer-08-02
Первый мелкий факап бросается в глаза практически сразу:
картинка не сохранилась в архиве
Что же это за требования такие, в которых опыт работы от 2-х лет, а опыт коммерческой разработки под винду минимум 3? И я молчу про 5 лет опыта в плюсах. Но не будём доёбываться, в целом глянем на требования:
картинка не сохранилась в архиве
Если кратко, то кандидат должен знать C++, многопоточность, STL, COM/ATL. Остальное – будет плюсом.
“С хуя ли мы так всё детально обсасываем?” — спросит любознательный читатель. А потому, что комодо даёт кандидатам тестовое заданьице. И не какое-нибудь там на 30-40 минут, а, сука, целый проект.
Тестовое задание – напиши антивирь
Заводят на тестовое вас определённым хитрожопым способом. Вначале разговор идёт о том, что вы умнейший и милейший человек. Конечно, никто не сомневается в вашем опыте и скилах, но нужно, чтобы вы показали свой продакшн код.
Как правило, да что там – в 99,99 % такой код показать вы нихуя не сможете, потому что педалили продакшн за бабки и под NDA. А, значит, если покажете, то нарушите условия договора со своим предыдущим заказчиком. Контрибьютить в опенсорц за “спасибо” любят немногие. А даже если и любят, то фикс бага в три строчки вряд ли покажет твоё неимоверное владение паттернами и новым стандартом плюсов. Была тут статьейка на ебаненьком, как гнобить разработчиков – читай про опен репозитории там.
Вот мы и подходим к тому, что показать ты можешь только своё еблище в скайпе. Рекрутёру очень-очень жаль. Но выход есть – тестовое задание. Тебе-то с твоим опытом и навыками его сделать – как два пальца! И щедрая компания комодо готова ждать даже несколько дней, всё для тебя. Бери весло и хуярь только. И вот оно – тестовое – уже летит тебе в скайп:
You need to develop simple malware detector.
Scanner
Scanner is core component implemented as shared library (DLL). Scanner component must be able
to:
— Scan file by path
— Scan array of bytes
— Load signatures file
Implement appropriate methods in the scanner interface.
Malware detection algorithm is the following: if scanned file contains any of predefined byte
sequences, it is considered infected.
The sequences are stored in the regular text file separated by newlines, in the following format:
HexString.{GUID}
Examples:
01ABEDFF55.{ab306a70-0fd2-4b4b-84fe-f9ebd899d90f} EE21DEAD827739ACCD028FFC.{5c34b10f-3f6d-4bbb-b9ec-2faa1ee07660}
If appropriate sequence is found, scanner must return its GUID. Use file mapping to increase
scanning performance.
Client
Client is UI or console application. Client application must be able to:
— Uses Scanner component to recursively scan specific folder.
— Scanning progress must be displayed.
-Scanning must be performed in the thread pool (2 threads per CPU core).
Bonus tasks (optional)
— Use modern C++11, C++14
— Implement Scanner and Client as separate processes with an IPC.
— Implement Scanner component as COM object in an in-process or out-of-process COM
server using ATL. Use ATL classes in Client application.
— Unit tests for Scanner classes.
—————————————————————-
You are free to refer to any documentation/internet etc.
Task estimated time: 1 — 2 days.
В сухом остатке – новый стандарт, а также ATL/COM – не являются обязательными навыками, но будут плюсом. Про WinAPI не говориться вообще.
Иными словами, комодо просит вас бесплатно хуярить тестовое несколько дней. Притом компания не отрицает, что вы вполне себе можете быть разрабом уровня синьор, но ей на это срать, потому тестовое оплачивать она не будет. Вам просто предлагают проебать несколько дней своего времени (при синьорском-то рейте), при этом никаких гарантий трудоустройства вам никто не даст.
Плюс, как вы заметили, никакой технический специалист пока на горизонте не появлялся – тестовое даёт hr, не отстреливающий нихуя – просто бери и делай, там видно будет.
Выполнение тестового
Раз из технарей никто не вышел на связь, мой товарищ решил ебашить так, как по его мнению, и по объективным причинам будет лучше.
Была сделана динамическая библиотека и исполняемый файл. Система сборки cmake, поддерживаемые оси – винда, мак и убунту. Было решено, что антивирус должен поддерживать как можно больше платформ, потому от решений типа COM/ATL стоит отказаться. Использовался новый стандрт С++ а также QtCore. Код покрывался тестами (gtest).
По функциональности всё было реализовано (сканирование, обход директорий и поддиректорий, отображение прогресса и т.д.) и работало на винде и убунте – за пару дней успел протестить только их. Было потрачено 4 вечера. Конечно, всё было не идеально, но товарищ отправил то, что было. Стал ждать фидбэка.
Для тех, кто не в курсе, что есть COM:
https://ru.wikipedia.org/wiki/Component_Object_Model
Простыми словами – это срань, прибитая к винде гвоздями и разработанная очень давно. В современных продуктах от неё отказываются, т.к. абсолютно непереносима на другие ОС.
ATL – срань, которая выходит из предыдущей срани, и нужна для использования первой:
https://ru.wikipedia.org/wiki/Active_Template_Library
Использование этого говна под большим вопросом в продуктах секьюрити, которые должны идти в ногу со временем и/или впереди планеты всей.
Сука, фидбэк
Наконец, настал этот день – день фидбэка. Он пришёл – вот он:
Добрый день!Спасибо, получили Ваше тестовое задание. По нему уже пришел фидбек:
usage of QFile instead of native file mapping and QThreadPool instead of STL or native windows threads as well as many controversial design decisions force us to think candidate is not suitable for our project
Всё! 4 вечера были проёбаны. И теперь ты знаешь, что после создания экземпляра QFile всё пошло по пизде. Если прочитать более вдумчиво, то парни хотят, чтобы вместо кроссплатформенных решений ты юзал API операционной системы. И если с файловым маппингом это ещё куда ни шло, то с потоками в Qt был реализован паттерн map/reduce, который в новый стандрат STL пока ещё не вошёл. Есть только предложение, парни, proposal:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3446.pdf
Про many controversial design я вообще не понял – что это, блядь, за срань? Человек потратил 4 вечера, хули вы тут взагали по загалям пишете? Где нормальный фидбэк?
Парням, видимо, через некоторое время стало стыдно, и пришёл более полный фидбэк.
Фидбэк 2 – перезагрузка
Более полный фидбэк содержит на несколько строчек больше – рассмотрим их все.
1) Checker.cpp: Checker::Knuth_Morris_Pratt() throw std::runtime_error("Pattern not found");
Why «throw» instead for the «return bool»?
Для поиска сигнатур использовался алгоритм Кнута-Морриса-Пратта. И пацанов вообще не смутило, что использовался именно он. А должно было, ведь для поиска сразу нескольких сигнатур он не подходит, а подходит Ахо-Корасик:
https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm
И парни из Comodo могли бы это заметить, но увы. Доколупались они к генерации исключения вместо возврата кода ошибки. Да будет вам, хлопцы-комодцы, известно, что «Чистый код» Роберта Мартина советует как раз генерировать исключения, ведь это добавляет в наш код наглядности. В общем, эта тема весьма холиварна, а вот эффективность алгоритмов – нет. Парень не успел реализовать Ахо-Корасик за 4 дня, а вы нихуя не отстрелили этого в своём же тестовом.
2) Dispatcher.cpp: void Dispatcher::SetGuid(const std::string& Guid) { memset(guidMemory, 0x00, GUID_SIZE); memcpy(guidMemory, &Guid[0], Guid.length()); }
What happened when Guid length will be greater then GUID_SIZE?
(Да, этот метод вызовется лишь после проверок на валидность строки
гуида, но все же)
Весь код не приводится здесь, как вы помните. Поэтому я кратко поясню ситуацию. У нас есть буфер фиксированоого размера, в него копируются данные из строки. Размер строки не фиксирован, поэтому для его определения используется метод length(). Здесь возможны 3 случая:
— строка длиннее буфера (то, чего парни опасаются), тогда может быть переполнение буфера;
— строка и буфер одинаковой длины, это нормальное поведение;
— строка короче буфера (парни не учли этот вариант).
Для того, чтобы исключить первый и последний вариант, строка перед подачей в рассматриваемый выше метод, проходит предварительную проверку на валидность. Невалидные строки не попадут сюда никогда. Таким образом, комодцы повторили поведение статического анализатора, именуемое как false positive. Т.е. приколупались к вполне нормальному куску кода.
Комодцы, рекомендую вам курс:
https://www.coursera.org/learn/software-security
Где на пятой неделе вам расскажут, каким образом статический анализатор должен проверять безопасность кода, как это достигается математически, а также что можно считать уязвимостью, а что – нет.
3) Mapper.cpp: Mapper::Mapper(const char* fileName) auto tmp = file.map(0, file.size()); if (!tmp) { throw std::runtime_error("Unable to map file"); } buffer.reset(new uint8_t[file.size()]); — Недопонимание идеи маппинга файла?
memcpy(buffer.get(), tmp, file.size()); — А что если память для
buffer не выделилась?
Парней здесь смутило, что товарищ маппит файл в память, а потом из замапленного куска делает копию. Дескать, маппинг уже отображает файл в память, с ним и работайте. Давайте и тут разберёмся. Во-первых, такое копирование, даже будучи избыточным, вполне корректно работает. Во-вторых, ни один антивирь сейчас не работает с маппами только для чтения, потому что ему нужно делать эмуляцию, деобфускацию и всякого рода преобразования с исходным файлом. С маппингом для чтения не получится в него что-то записать – он же для чтения. Маппинг на запись похерит оригинал. Но! Тут ещё как-то
можно согласиться, что конкретно для этой задачи было лучшее решение. Тем не менее, представленное решение тоже было рабочим!
Теперь вторая их претензия, что будет, если память не выделилась. Комодцы сами говорят про стронг скиллз в плюсах, и так косячат. Если память не выделилась – будет исключение, и до memcpy дело не дойдёт. Почитайте, комодцы, вам будет полезно:
http://www.cplusplus.com/reference/new/operator%20new/
4) Scanner.cpp: const char* GetInfectedFileGUID(const char* path) Can return nullptr, valid GUID string and empty GUID (0000-0000-...)
And all these results will be printed as founded matches.
А вот этот пиздёжь даже комментировать тяжело. Как вы помните, антивирь работал, его тестировали. А значит – он собирался и запускался. Если бы комодцы достали руки из жопы и запустили эту поделку, то увидели бы лог, в которого таких “founded matches” почему-то не было. Возможно, потому, что они нихера не могут читать в статике код. Парни, что это – недопонимание С++?
Скажу вам, ради справедливости, косяки там были. Конечно, куда ж без них – и не один, и не два. Вот только комодцы не нашли ни одного.
Вывод.
1. Мопед не мой, я только написал статейку на ебаное. Сам код тестового я не писал, его писал другой человек. Но он положил на вас, Comodo, хуй, и я бы положил, если бы вы не начали стучать мне в linkedin с этой сраной вакансией.
2. Убеждаюсь, что делать какие-то тестовые, не поговорив с техническими специалистами “до” — пустая трата времени. Также как и трата времени – общение с фриланс рекрутерами. Конечно, хотелось бы общаться с рекрутерами компании напрямую, если уж без рекрутёров никак. Но могу сказать из своего личного опыта, что рекрутёры в больших компаниях заняты рассказами друг другу о том, как они на выходных в клубешниках с причмокиванием сосали писюны. На работу времени не остаётся. Вот и приходится нанимать сторонних фрилансеров.
3. Комодо затеяли какую-то хуйню. То ли там у руля сидит дебил, который вообще без дупля во всех этих технолоГейях, то ли нужно показать руководству, что в Украине некого нанимать. И потом в ход можно пустить кумов, сватов, братов и прочих? Хуй его знает, но что-то там явно не здраво.
4. Читатель, если ты захотел в Комодо, возможно, тебе не стоит тратить своё время на людей, у которых цель – просто поебать тебе мозги?
5. Комоды, комодцы, комодовцы! Ну нахуя вы это делаете? Получается, что вы заявили достаточно высокую зп на вакансию, но никого не хотите нанимать? Кандидаты рвут жопы, рекрутёры рвут жопы – а вам это не стоит ни копейки, ведь вы платите за результат, а его нет.
6. Рекрутёр! Не трать своё время – эта вакансия будет висеть вечно.
7. Редакция, жду ваших комментов. Интересно мнение со стороны. Кто виноват, кто прав, что
делать?
Комментарий ебаной редакции
Дорогой Анонимус! Спасибо за отличную статью. Шарящих в «плюсах» в редакции нет, поэтому по технической части остается лишь поверить на слово. Касательно тестовых заданий на несколько дней, то здесь, конечно, тонкий вопрос. С одной стороны, время всегда жалко, поэтому неплохо бы таки перед приступлением к заданию пособеседоваться с технарем, чтоб вы друг друга поняли и чтоб не было явного кидка. Большие задания (больше, чем на полдня, а то и на несколько дней) — это настоящая роскошь, несколько часов/дней жизни. Как правило, стороны понимают это, поэтому действует негласное правило — если решение худо-бедно работает, контора не ебёт мозги и берет человека на работу. Ведь по сути это работающая программулина, законченный мини-проектец. Даже если никто его никому впаривать небудет, это завершенный кусок работы, на который были затрачены личное время и усилия — это уже достойно уважения. Исходя из вышеперечисленного, можно сделать вывод, что либо у Комодовцев нет опыта в найме, либо им не горит и они перебирают кандидатами, пренебрегая их лояльностью и особо не парясь. Что ж, ну, будут, значит, и дальше разрабатывать своё Комодо ограниченными ресурсами. Другу же совет — если речь идет о драгоценном времени — лучше по сто раз переспросить HRшу на предмет контакта с технарем и четко дать понять, что личное время — на вес золота.
Коментарі (272)
Автор аутист. Антивирусы заточены под Windows, его адекватно попорсили написать ПОД ЕБАННЫЙ ШИНДОУС с использованием winapi, а он с какого то хуя решил использовать высокоуровненные кросплатформенные решения и Qt. В такой сфере как антивирусные продукты уклон делается на системщину и там нахуй его «современный C++» не нужен. Хочешь создать трiд? Юзаешь CreateThread на прямую без абстракций-хуякций. И так во всем.
Хорошо что этого дебила не взяли на работу. Он бы там в первый же день охуел от того на сколько их код отличается от его подходов. С++ макаки воистину ничем не лучше веб-макак и прочих ангулярщиков. С++ макака это такой пидарас который нихуя не разбирается в том что и как работает. Но при этом мнят себя илитой.
мимо Си-бог
MOV ЩЕКА, ЧЛЕН тебе, проверяй
intel-cинтаксис сасает, как и ты
ORG #8000
LD A, [CHLEN]
LD [SCHEKA], A
RET
CHLEN DB #FC
SCHEKA DB 0
Кроме KMP есть Z algorithm http://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/. Так что читайте блять кормана.
ОП, кстати, в своих анализах верно указал, что нужно было автоматный ахо-корасик юзать. Какой смысл тут с Z хз.
Сеньор Крестушок на связи.
Автор статьи, как и его друг (назовём его Игорь-Пигорь) — июни. Объясню почему:
1. Тестовое задание предельно ясно написано и весма-таки простое.
2. В задании написано чёрным по белому, «ДЕЛАЙ, СУКА, ПОД ВИНДУ, ИСПОЛЬЗУЯ WIN API И НЕ ВЫЁБЫВАЙСЯ». Пигорь же зачем-то выебнуться решил и захуячил кроссплатформенно, используя высокоуровневую Qt-прокладку. А знает ли дорогой Пигорь, что использование GPL фреймворков подразумевает линкование динамических библиотек, а не статических? Это открывает неплохой путь для злоумышленников для подмены соответствующих DLL. Если же, он использовал статическую линковку, то по-любому нарушил права LGPL, если у него не куплена соответсвующая лицензия индивидуального Qt-разработчика.
3. Пигорь так же зачем-то бросается исключениями, хотя, такая вещь как исключения в C++ — весьма дорогая в плане производительности и stack unwinding кода, который генерится на этапе компиляции. Идеальным было бы использовать C API для Scanner DLL, не плюсовой, т.к. с плюсовым интерфейсом всегда возникают проблемы совместимости из-за name mangling’а разными компиляторами и использования разных STL рантаймов.
4. Пигорь не слышал про assert’ы? Когда это однозначно ошибка разработчика, почему не выставить assrtion failed вместо бросания исключением?
5. memcpy, memset? Очень опасные функции, которые отстреливают тебе ноги при любом удобном случае.
6. Копирование всего файла в память — поебистика. А если файл дохуя терабайт весит, то что? Это серьёзный косяк. Они явно ожидали использования функции CreateFileMapping в коде Пигоря.
Моё мнение, комодовцы всё правильно сделали, что отшили Пигоря. Единственное, что выбесило — это кривой английский в ответах. Зачем вообще общаться с соотечественниками на КРИВОМ английском?
Как я понял, им нужен чувак, который разбирается именно в виндовом программировании и сможет поддерживать их старые кодовые базы и контрибьютить в новые проекты на C++11, C++14. Блестать знаниями кроссплатформенного программирования на Qt было совсем не нужно. Qt сейчас знают почти все адепты касты C++, так что, это попса и не используется в их проектах. COM/ATL — бородатые технологии, которые, скорее всего, используются в старых проектах, которые нужно поддерживать. В новых, они, конечно, вряд ли их юзают.
Короче, Пигорь крестушок с завышенным ЧСВ, а автор статьи дятел.
как боженька смолвил
Где ж ты, пидарас, увидел там, что явно написано юзать winapi? Под винду — под винду тестовое компилится, об этом же сказано было в статье. Про лицензию qt — да, ты прав, но коммерческая лицензия покупается. Прикинь, её реально купить. И сделать это проще, чем портировать винапи поделку на андроид, реалли. Если ты по поводу того, что кутэ юзалось в тестовом, то пацанам отправили исходники. Лицуха не нарушалась.
Давайте для всех поясню пару моментов — нахуя там кутэ? В основном, из-за паттерна map/reduce. В остальных местах — простота и кроссплатформенность. Второе — нахуя там опасные функции для работы с гуидами? Там библиотека. В библиотеке есть такое понятие, как манглинг экспортов. Extern C отключит манглинг, но нужно юзать встроенные типы. Манглинг нужно отключать, иначе библиотеку не заюзаешь из ехе, собранного другим компилятором. Студия и мингв, например, манглят по-разному.
В требованиях к самой вакансии прослеживается точные намёки на WinAPI, а в задании в бонус тасках COM/ATL. Если ты не долбоёб, то смекнёшь чего от тебя ждут.
Пигорь, залогиньтесь.
Намеки — это не сказанное явным образом, поставте себя на место интервьюируемого,
смогли бы вы намного лучше, при желании сделать по проще — я думаю вряд-ли.
На словах все мастера махать хуем, а как дойдет до дела …
Мебельному изделию надо было точнее прописывать задачу, а то выглядит как
самолюбование имбецила-олимпиадника в стиле «а что там рассказывать и так все понятно»,
да и постановка задачи не технарем, с возможностью прояснить не понятные моменты вызлядит
как банальное НЕ УВАЖЕНИЕ к потенциальному сотруднику — будите по проще 😉
Ну а автору я б посоветовал всетаки научится справляться со стрессом, там нужно
было не рваться в бой с первым выстрелом, а попытаться прояснить не понятные моменты,
и если ЭТИ КАДРЫ не способны проявлять элементарную АДЕКВАТНОСТЬ и УВАЖЕНИЕ
в человеку который потратил на вас время то и нах сии НАРЦИССЫ нужны,
дальше могло быть сплошное садомазо.
Где, сука, точные намёки на винапи? Где?
>Strong knowledge of Windows API
>Experience in commercial development for the Windows environments
Ни слова про Qt, cross-platform, *nix. Смекаешь?
Тебе знакомо понятие «оверинжиниринг»? В требованиях было указано UI либо консольный клиент. Какого хуя тащить такую громоздкую зависимость как Qt (она реально громоздкая, инфа 100%)? Ради того, чтобы налабать одну формочку? Можно было консолью обойтись!
Ради мнимого map/reduce из QtConcurrent? Да ебись оно конём! Крестоблядство скатывается в дельфи-говнокодинг с использованием VCL, когда на любой чих дельфи-макаки бежали в интернет искать готовый компонент.
В интернете полно примеров реализации thread pool’ов с использованием STL/Windows API. Ради этого не нужно было тащить целый фреймворк.
Это значит, что у Пигоря полностью отсутствует инженерная культура, поощряющая использование данного тебе инструмента на максимум — Пигорь идёт нахуй со сцены, следующий!
Сука, ну в статье же qtcore написано, какие кнопочки, хоть бы тестовое глянул, пидар
И стоило только ради потоков тянуть QtCore? Ты ёбнулся? Мало того, что это всё равно сильно дохуя, всё равно что стрелять из пушки по воробьям, так ещё и накладывает обязанности на собирающую сторону, устанавливать полностью весь фреймворк Qt.
Не отмазывайся, Пигорь, ты всё равно проиграл.
Да не бомбит у меня! (с)
Так ты ещё и тупой, сука.
Ты не увидел намек на винапи? Так ты просто тупой, здесь уже больше нечего добавлять.
А я один не понял, как отключение декорация имен способствовало тому, что метод класса принимает std::string, а данные хранит у себя как char[]?
пайти вайти в РБ )))
FYI
https://tech.onliner.by/2017/08/17/pojti-v-it-3
Хотел излить тонну бугурта на пидрильную статью и степень уебищность автора и его его друга, но почитал комменты выше — уже все расписали нет смысла повторяться. Итог: июни максимум, и с таким гонором нахуй в айти не нужны никому — пусть улицу подметают лучше, и не портят своим пиздежом репутацию крестовиков. Сука, бросать исключение на каждую ненайденную из овер 9999999 сигнатур — это просто пиздаааа…. 11 индусских кодеров из 10. Мартин блять советует… Хуяртин, ебанаврот!
Добавлю лишь, что КОМ/АТЛ и иное некро-говно указаны _как опшионал_ не просто так, и уж не в коем случае не потому, что комодовцы хотят на нем писать. Я на 99% уверен, что у них уже есть большой пакован легаси-кода, от которого никуда не деться и переписать тоже никто денег/времени не даст, и с которым им надо уживаться. А потому, естественно что для них хорошо, если нанимаемый уже видел и знает что это за дичь — адаптация пройдет быстрее.
Что ты там хотел? Уже всем понятно, что гневные комменты выше писал один и тот же ссаный мудак из комодо, и не лень было парню перелогиниваться. Ну хоть так тебя, пидара, заставили делать свою работу. Если человек тратит пару дней на твоё тестовое, будь добр потратить 20 минут на развернутый ответ. Это же часть твоей работы, унылое ты падло.
По поводу иксепшенов — приебываться надо к алгоритму, а не иксепшенам. В худшем случае кмп работает линейное время, плюс потом делается генерация исключения за О(1), так что да-да ты правильно заметил, что ненахождение паттерна — самая частая ситуация, но ты не знаешь, баран, что с этим делать.
Какой же ты долбаёб. Ни один человек который на плюсах пишет хотя бы пару лет и имеет дело с нормальным кодом не будет выбрасывать исключение при ненахождении паттерна. Это даже без объяснений выбивается из колеи и режет глаза ++ разрабам.
Всем абсолютно похуй какой из абоссаных алгоритмов ты спиздишь с emaxx, им нужно проверить уровень владения плюсами. И автор со своим воображаемым другом показали, что уровень пиздец какой никчёмный. Это пиздец как неочевидно, что функция вроде contains() выбрасывает исключение, а не возвращает false, например. Ни один добаёб не собирается читать код твоей сраной функции чтобы узнать какое дерьмо ты решил оттуда выбрасывать. Особенно std::runtime_error — это верх ебантизма.
Даже из обоссаной статьи ясно что оно тут не подходит: http://en.cppreference.com/w/cpp/error/runtime_error
» It reports errors that are due to events beyond the scope of the program and can not be easily predicted. »
Конечно, отрицательный результат проверки хуй предскажешь, это же охуеть какая внештатная ситуация.
И причём тут сложность вообще? Ты пиздец какой даун, если любую строчку кода сложностью измеряешь. Создание потока это тоже O(1)?
PS накидал исключений тебе за щеку, обрабатывай
Девочки не ссорьтесь :o)
Согласен, девелопер с исключениями херню сморозил — я б не отождествлял
это с не знанием плюсов, скорее с новизной предметной области.
Не кажный день тебе предлагают антивирь за два дня нафигачить,
тут и не такое можно выдать 😀
А вот комод повел себя не красиво, я б скажал даже по свински — технарь
мог и снизойти до аудиенции интерьвьюируемому.
К слову я, за комодЪ узнал только из этой статью,
он шо, внатуре, антивирь пишут или так стебаюцца?
Причём тут предметная область? Смена места работы разраба очень часто соответствует смене предметной области, но это не значит, что все начинают писать, как дно.
Да и какой антивирь. Тут задание детское — найти паттерн байт в файле. Что теперь блять если ты через curl скачал html страничку — браузер нафигачил? А если форму склепал — веб приложение?
По сути тут тестилось знание пляццкого WinAPI и знание алгоритмов поиска подстроки в строке. Не поверю что большинство C++ UI-щиков сами имплементируют постоянно такие алгоритмы 😉
Большинство дальше доки QString и не ходило.
Ребята вы говорили и говорите про свое на своем языке, бросайте ломать копья
ОБА НЕ ПРАВЫ!
При разработке антивируса под шиндус требуется знание шинапи. Какая неожиданность!
хватит пиздеть вы две прыщавые сучки
Сама дура 😛
спиннер ты на хую вертел, дрочер мамин
Ну, интрервьюер ничего объяснять не должен. Но на вопрос ответить обязан, если задали
Я не из комодо, а ты дебил.
Не, баран у нас автор, тоесть судя по всему ты…
Ты бросаешь типовой экзепшен, тоесть ты по умолчанию не можешь разрулить ситуации когда у тебя системная ошибка, а когда бизнесс ошибка, эьто проеб с экзепшеном номер раз.
Далее — я чуть более чем уверен, даже не видя остального кода. что у тебя там не обернут трай кетчем блок поиска и вывода месседжа, и он находится выше, это два.
И три, я опять таки чуть более чем полностью уверен. что тела как минимум твоих деструкторов трайкетчем не обернуты, и спокойно могут плюнуть исключение, и так сказать без палева мы приходим к той ситуации когда ты своими руками загоняешь в стек второй экзепшен подряд со всеми вытекающими. А ведь ты просто хотел сказать что у тебя сигнатура не найдена.
Иксепшены в деструкторах? Да ты еблан знатный
ты кароче так злишся, шо нихуя не понял (это я так на июня типа намекаю) ….он имел ввиду, что наверняка есть деструкторы, которые не noexcept, а т.к. при вызове твоего эксепшина сработает и такой дктор, то есть не нулевая вероятность выхватить и от него повторный эксепт.
Зачем далеко ходить? 🙂
buffer.reset(new uint8_t[file.size()]);
Вот тут наш дорогой кросплатформенный поциент сам себе набрасывает потенциальный экзепшен…
Хотя даже если ему сказать что это андефайнед бехевиор и так писать нельзя — он все равно не поймет 🙂
🙂 Прикинь, да, деструкторы по умолчанию бросают исключения, все, и подавлять их должен ты. если ты начинаешь использовать исключение как средство логики.
Я б мог написать антивирус и на ангуляре в браузере такой. И мой будет не чуть хуже этого, потому что рекрутер взял себе qt и прочии абстракции облегчалки жизни, я чем хуже буду? Коню понятно что надо было делать на лоу левел апи. Написали что давай COM, dll. Нет, хочу qt и кроссплатформенность.
Вполне нормальные требования. Тестовое задание на 1-2 дня — тоже нормально, особенно если им нужен именно разработчик а не формошлеп. Ну а остальные проблемы чисто из-того что разбором тестового задания занимался какой-то долбаеб (остальные видать были заняты).
Сроки ебанутые, такое минимум неделю делать.
Тут проблема в том что работодатель не смог объяснить что ему нужно, а соискатель не смог понять. Такое обычно случается если идиоты оба.
Задание вполне понятное, но очень объемное.
Видно что контора ожидает себе гребца у которого каждый рабочий день состоит из 20 часов но будет оплачено только восемь часов.
Любое тестовое задание это хуета, не стоящая потраченного времени.
Тем более антивирус/шашки с искусственным интеллектом/модуль запуска Светлой в Тёмную.
Представил как молодой и энергичный инноваторский светлый ум апплаится инженером на очередной ооо «рыбстройхозпром», и там старые пердуны втирают ему совковые госты, отметая нахуй все инновации… Потом еще удивляются, почему их компания говно, а их продукты никому нахуй не нужны, хотя на рекламу в печатной газете регулярно выделяется треть бюджета предприятия.
Чего хотел соискатель в компании, которой после 20 лет истории нужны ссылки на вики при упоминании?) И так ведь ясно, что они — унылое говно)
Тестовое делать заставляют. Совсем охуели.