В 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)
Я всегда предпочитаю тестовые задания вместо рассказов о том какой я охуенный. Я в данном случае товар, и время которое я трачу на тестовое, это расходы на маркетинг. Покупатель должен быть уверен что берет качественный товар который стоит тех денег который за него просят. Рассказы про годы опыта мало что значат, так как не известно чем ты эти годы занимался. На месте соискателя в статье я бы перед выполнением задания попросил бы прояснить неясные моменты. А после получения обратной связи, я бы переделал задание и послал его снова. В данном случае тестовое задание выявило у соискателя неспособность лидировать проект и даже при неблагоприятных условиях довести его до состояния удовлетворяющего требованиям заказчика, особенно если сам заказчик косячит с требованиями. Что в реальной жизни встречается постоянно.
Послал тестовое задание тебе за щеку.
Проглатывай.
Спасибо милый, я ценю твоё внимание и заботу. Надеюсь и дальше будешь делать мне приятные сюрпризы.
И ещё, навыки проверяемые в тестовом задании должны соответствовать описанию вакансии. Если не соответствуют, то требовать другое тестовое задание по причине не соответствия.
Ну да, кодерам больше ж делать нехуй, кроме как «инвестировать в маркетинг». Я тут давеча маляра для поклейки обоев искал, так блять у большинства ни портфолио, нихуя, а о том, чтоб пару полос черновых обоев поклеить в качестве тестового, вообще речь не идет, в лучшем случае глянут как на идиота и все. Не понимают, бляди тупые, важности расходов на маркетинг, не то что кодерки:
— Хотите индивидуальные интервью в кучу этапов с двумя СЕО, тремя лидами и домработницей фаундера, где именно последняя завернет вас, раскинув карты таро? Та пжалста!
— Тестовое на неделю просратых вечеров? Всегда готов!
— Педалить какую-то хуйню в опенсорц, потому что лох и ноулайфер Вася педалит, и его за это хвалят? Ну, надо, значит надо!
— Раскорячиться а-ля goatse и дать сфоткать себя для доски почета на стене офиса любимого работодателя? Почему бы и нет?
Тьфу, блять, соски-спермоглотки какие-то. Может начнете себя хоть немного уважать?!
Сравнение с маляром не корректно. Представим что вы взяли маляра в штат в вашу компанию, сколько времени займет понять что маляр профессионально не компетентен? Допустим неделя. А сколько займет найти нового? Допустим еще неделя. Тем самым вы рискуете потерять неделю зарплаты маляра (при условии что он не выполнил никакой работы) и 2-е недели времени. Вот ваш максимальный риск в случае неправильного выбора. Однако в случае с разработчиками, ваши риски как по деньгам так и по времени значительно выше, и вы хотите эти риски уменьшить. Соискатель тоже рискует, придя к вам работать на должность на которую он не подходит, он рискует быть уволенным через примерно 3 месяца и вынужден будет тратить свое время на поиски работы при этом не получая дохода, что равносильно убытку. Поэтому, с учетом специфики, каждая сторона имеет право на более тщательную проверку контрагента, чем в случае с маляром.
Чувак, ты сравни бюджеты корпорации, и мои, как физ. лица, и прежде чем втирать о безусловном размере потенциальных рисков, подумай сам, по-человечески, кто больше пострадает, я, если мне криворукий абизян перехерит материалов на сотни баксов, или компания, пусть даже выгнавшая 5К-баксового дева с испыталки? Это во-первых.
Во-вторых, тестовое, кагбе, никакую проблему рисков и не решает. Если контора не уверена в моем CV, не уверена в моем участии во всех перечисленных проектах, то как она может тупо быть уверенной, что тестовое лепил я, а не лошок-Васёк за пачку доширака?
В-третьих, да, как раз то, о чем ты сам написал, «соискатель тоже рискует». Только хуй как проверишь, что после недели, просратой на тестовое, поработав месяц-два, не окажется, что гениальный заказчик решил завязывать пилить убийцу пейсбука, все свободны, все идут на хуй, а горе-стартапер собирает новую команду для запила операционки с нескучными обоями… повторяя цикл смены настроений еще через два месяца.
Ну и в-четвертых. Сугубо субъективный фактор. Вот мне лично ни разу не удалось устроиться в шарагу, где пришлось проходить больше двух этапов интервью и тестовые дольше часа-двух. От друзей, знакомых слышу аналогичные мнения. Тут уж вполне очевидные вопросы напрашиваются сами собой.
Вспомнился опыт одного знакомого. Собесы, тестовые, хуё-моё, оффер, смачный adiós на текущем месте работы, первый рабочий день на новом, кхм… а сорцов-то, цукоёбаныйтынахуй, НЕТ! То ли сбилжено все, то ли обфусцировано, не помню. Тык-мык, хуяк-пиздык, попытка объяснить заказчику, в какой он на самом деле жопе, выдача эстимейтов на запил всего продукта с нуля, и через пару недель безуспешного решения заказчиком вопросов с предыдущими разрабами — всем спасибо, все свободны.
При том, речь не о говно-заказе на апворке, а о вполне себе среднеразмерногалерной вакансии. Интересно, сейлзам успели дать бонусов за приведенного кастомера? Если да, могли б поделиться с тем моим знакомым, ему-то после этого цирка пришлось еще пару недель искать подходящую работу.
Но да, вы продолжайте делать заёбистые тестовые, по-порядочному уходить с текущего места работы, не пытаясь усидеть на двух стульях в целях перестраховки хотя бы пару-тройку недель. Только это… в транспорте на меня не дышите, а то кончой воняет.
С вопросом как находить хороших работников и как найти хорошее место работы, бьются «лучшие умы» и тупые ХРюши. Абсолютно хороших решений нет. Есть только хуевые. Вопрос что из хуевого лучше. Работник не гарантирует что не сьебется посреди проекта. Работодатель не гарантирует что через пару недель у него все не накроется пиздой и всех уволят. Нужно смотреть на все аспекты, и более тщательно подходить к выбору.
По сути есть 3 способа найма: по рекомендации, по интуиции, по тестам. Ну и комбинации между ними. Я написал что из этих 3-х я предпочитаю тесты, так как в случае тестов у меня больше контроля над результатом процесса.
CV может быть верным но этого недостаточно. Тоесть пишет человек что у него 5 лет опытах в крестах, и что участвовал в таких-то проектах, что это значит на практике? Как понять его уровень? Лишь по тому как он говорит? А если человек не разговорчив?
Проверить что человек сам написал задание легко, например спросив его почему он выбрал сделать так а не подругому. Тот кто сам писал будет отвечать понимая вопрос. Даже если он не сам писал но понимает что было и почему сделанно это — уже хороший результат.
Охуел от твоего объяснения.
Представим что у нас есть число x. Число x = 7.
Если нам нужно найти число y, то с учетом специфики числа y, оно больше числа x.
Вот еще одно обьяснение: Главное, что я понял общаясь с ИТшниками — большинство не могут понять что такое управление рисками. А потому делают 2 ошибки: Идут работать в конторы где заведомо известно что риск быть кинутым высокий а потом тут плачутся когда их кинули за борт. Не понимают что в процессе найма работодатель пытается снизить риски найма неподходящего работника. Все время ИТшники пытаются сравнить программеров то с художниками то с малярами. — Нихуя вы ни Пикассо, но и не маляры, а потому и платят вам больше но и спрашивают с вас тоже больше. И напоследок цитата: «Управление рисками — это процессы, связанные с идентификацией, анализом рисков и принятием решений, которые включают максимизацию положительных и минимизацию отрицательных последствий наступления рисковых событий.»
единственный вменяемый комментатор на ебаном, респект Женек
> — Хотите индивидуальные интервью в кучу этапов с двумя СЕО, тремя лидами и домработницей фаундера, где именно последняя завернет вас, раскинув карты таро? Та пжалста!
Бля, это про Genesis (который на подоле). Надо будет как-нибудь написать про эту гнилую контору, там говна на пару месяцев чтения можно насобирать.
> Use modern C++11, C++14
а чего сразу не С++20? кому нужен этот модерн, технологии будущего — вот наш девиз!
throw std::runtime_error(«Pattern not found»);
Why «throw» instead for the «return bool»?
Привед дебилушка. Ты будешь проверять миллион файлов, и на чистых файлах 999000 раз бросать исключение ?? Это крайне тупая трата ресурсов.
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?
И публичный метод без проверки торчит наружу библиотеки — да это ж эпик !!
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());
Блин, взрослый же человек,должен же понимать , что проект пойдет на свалку после собеседования и никаких деобсфукаторов не будет.А показывает себя дураком.
4) Если в резюме есть упоминание какой-либо технологии,- следут её впихнуть и к месту , и даже там где немного не к месту, — вместо этого строчим на qt
Я , такого фрукта взял бы только как джуна на 327 баксов.
кстати насчет исключения, при грамотной обработке — никакой траты ресурсов не будет, но это при грамотной и грамотном коде, а тот факт что бросается стандартный экзепшен с текстовым сообщением — заставляет в этом усомнится.
Ага, stack unwinding магически рассосётся.
Да-да, -fno-exceptions и пизда.
Не пизди. Проверка гуида там идёт до этого вызова, он проверяется на соответствие регулярному выражению. И в том и теория статического анализа — если есть одна проверка, далее не надо делать ещё 100500 просто потому, что ты увидел memcpy. Определись — с одной стороны проект на свалку и деобфускаторов не будет, с другой исключения работают слишком медленно для продакшена. Хуйню пишешь
Если метод не публичный, то фиг с вами 🙂 Одна проверка есть и хватит…
Только что такое есть буфер? И почему внутри буфер, а снаружи строка? Где копирование нуль терминатора? Или типа скопировал строку в буер без нуль терминатора, но по фиксированному размеру — и получил байт представление гуида?
В этом методе что с точки зрения стилистики, что здравого смысла, что всего прочего — какая то хуита.
А-а-а-а!!!
Замолчите 😭
Бамбануло походу
Я, до речі, теж у Комодо співбесідувався, не взяли. З тестовим пронесло — показав початковий коміт бібліотечк з використанням COM — все одно в production той код пішов повністю переписаний, тож тестового не просили писати. А от на співбесіді сам налажав — кілька днів не висипався, пропустив очевидний витік пам’яті в коді, який дали рев’ювити, та і алгоритмічну помилку не помітив.
Это просто трешак и угар…
1. Даже имбицилу должно быть понятно после прочтеня ТЗ что одна из его задач — как раз проверить знание WinAPI.
2. Кросс платформенное решение на QT для simple Malware detection? Серьезно? QFile вместо File Mapping? Серьезно? А сколько там копирвоаний памяти? Тестировали? А что если натравить ваш сканер на 100гб папку с гигабайтными файлами? Сразу грохнется или к новому году закончит?
3. «Чистый код кричали они» throw std::runtime_error(«Pattern not found»); — а где ж там хенделр то, так что бы понимать докуда вы чистый код дочитали?
4. memset(guidMemory, 0x00, GUID_SIZE);
memcpy(guidMemory, &Guid[0], Guid.length());
Это что за пиздец? Что такое guidMemory и где он обьявлен? &Guid[0] серьезно? старый С++ &(guid.front()), новый guid.data().
Если гуид в стринг формате — что это за секс с его копированием, если он в байт формате — то почему обернут стрингом? Или афтар просто не знал как сконверитровать гуид?
5. buffer.reset(new uint8_t[file.size()]); а если файл в гиг, а если в 10? А какой деаллокатор по умолчанию простите у std::shared_ptr?
6. Вы там определитесь вы на чем пишете? Ацкая смесь Qt, stl, old C…
7. Написать кор — там реально на 4-6 часов, за еще 4-6 вполне реально прикрутить бонусные свистоперделки если владеть стеком.
З.Ы. Я не имею никакого отношения к комодо, и против разного рода тестовых заданий для Синьоров\Мидлов, но есть несколько НО:
1 — Взялся за гуж — не ной, я к примеру в паре мест прекращал разговор как только речь заходила о ТЗ.
2 — Наговнокодил — прими как должное фитбек, а не ной по интернетам какой ты классный а все не дартаньяны.
3 — собеседуюсь на синоьра, хорошо бы С/С++ знать и понимать, а не писать гавно прикрываясь умными или не очень книжками и курсами типа курсеры или чистого кода, а так же знаниями википедии и алхоритмоф (по педивикии), но блиать жалобами на то что варемени дескать небыло.
4 — И вообще даже в ранге мидла не мешало бы знать, что медленнго работающее, но раблотающее и стабильное приложение, это намного лучше чем быстрое и с патернами и по книжкам, но так же быстро падающее в корку.
кстати я тоже затупил, так как не привык видеть стрингов в том месте от слова вообще, у std::string есть замечательный метод c_str() 😉
Тестили на 2 тб винте, в кор дамп не вывалилось. В комодо тож могли запустить и потетстить, если бы у них завалилось — могли бы ткнуть носом, типа, вот валится. А так то всё влажные домыслы.
эхх…мое любимое, а тестили под нагрузкой? Например стартанули на 8и ядрах….а потом паралелльненько make -j 12 для кернеля, или хоть того же qt ? И че там будет? Вот хром нахрен в аут уходит и систему за собой тащит — какой-то там планировщик у него сума сходит. У меня уже в мейках больших проектов забито killall chrome
А на 1 ядре тестили? А аффинити меняли?)
…чойто мне кажется полезут недоделки.
И как? Сколько раз удалось по 1гб проаллоцировать подряд? 🙂
Парень, на х64 осях удалось и не раз, и не два. Но тебе не понять
Постучалась ко мне недавно HR из сциклума, как раз на комодо. Все заебоны автора про кроссплатформенность им на самом деле до сраки — они пилят разные версии под винду, мак и линух (под мак\линух пилят 3 тела в Одессе, сейчас хотят разделить и набирают команду под линух), до технической части у меня не дошло — требовали командировки к заказчику, и я сразу сказал, что идите лесом, и слава б-гу, как оказалось
Что такое Комодо и нахуй оно нужно?
в гугле забанили?
а по поводу второго вопроса — оно нахуй никому не нужно
Это был риторический вопрос, пиздюк
как будто это означает запрет на выебывание
> Как правило, стороны понимают это, поэтому действует негласное правило — если решение худо-бедно работает, контора не ебёт мозги и берет человека на работу.
В идеальном мире)
Есть такое ебаное понятие — мониторинг рынка. Очень похоже на описанное.
Да, кстати, «Как правило, стороны понимают это, поэтому действует негласное правило» — та прекращайте, если бы мне нежун был не мидл, а хотя бы мидлосиньор — то после такого ТЗ хоть оно 10 раз работай, я бы кандидата не брал — ибо времени бегать за ним и учить его не говнокодить — ни у кого нет.
Как по мне вполне адекватное задание. Знающим язык человеком делается за вечер 4-5 часов.
добавлю, что это к вопросу о девальвации значения самой лычки «сеньор».