LINUX.ORG.RU

Embedded C: вопросы на собеседованиях

 , ,


4

5

Я знаю, на лоре много сишников и ембедщиков. А проводящих собеседования на работу еще больше.

Так вот, уважаемые отбиральщики мужей у жен специалистов на должность embedded C developer, что вы обычно на собесах спрашиваете?

Особенно интересны вопросы по Сишке с намеком на завалить кандидата — неочевидные или на хорошее знание стандарта.

Знаю, в гугле такого много, но хочется от живых людей примеры, а не от индусов, пиарящих себя и свой сайт.



Последнее исправление: untitl3d (всего исправлений: 3)

Когда-то отправлял в одну контору резюме сисадмина. Прислали тестовое с какими-то суровыми протоколами управления, вовсю используемыми в производственных контроллерах. А я в них вообще не разбирался, да и САУП админить как-то совсем не хотелось. Возможно, и у тебя выйдет что-то подобное.

Bagrov ★★★★★
()
Ответ на: комментарий от Bagrov

Я не собираюсь собеседования проходить, мне просто интересно.

untitl3d
() автор топика

один раз про макросы container_of() и offsetof() спросили

Harald ★★★★★
()

с намеком на завалить кандидата

Каким будет результат выражения 0x80000000 == -0x80000000? Почему?

Пока что ещё никто правильно не ответил.

unterwulf
()
Ответ на: комментарий от unterwulf

0x80000000 == -0x80000000? Почему?

0xблабла - это беззнаковый тип. Вот почему.

Пока что ещё никто правильно не ответил.

The negative of an unsigned quantity is computed by subtracting its value from 2^n, where n is the number of bits in the promoted operand.
The type of the result is the type of the promoted operand.

https://eel.is/c++draft/expr.unary.op#8

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

А если константу до 64 бит довести с помощью L? Сейчас не у компа, проверить не могу, но думаю, что результат изменится.

Kogrom
()
Ответ на: комментарий от unterwulf

с намеком на завалить кандидата

Каким будет результат выражения 0x80000000 == -0x80000000? Почему?

Пока что ещё никто правильно не ответил.

Абсолютно бессмысленный вопрос для интервью. Как человек через которого прошли сотни людей позволю себе смелость заявить: (а) задачи «завалить» в принципе не должно стоять, и (б) к ответу на вопрос «а сможет ли человек для нас сделать что-то полезное» оно вас ни на йоту не приближает. Я, например, узнал что signed integer overflow is an UB спустя лет 15ти плотненькой такой разработки и многих сотен тысяч строк кода, к сожалению после того как оно выстрелило в проде. И что?

bugfixer ★★★★
()
Ответ на: комментарий от fsb4000

Ничего не смущает? Почему битность повлияла если в шестнадцатеричном представлении знак не важен? Почему компилятор на знак не ругается?

Kogrom
()
Ответ на: комментарий от fsb4000

Была бы там беззнаковая переменная, то да, был бы операнд. А в исходном коде похоже что просто два литерала. Если взять знаковую переменную и присвоить ей литерал с минусом в шестнадцатеричной форме, то и переменная будет отрицательной. Какой тогда смысл в утверждении, что в шестнадцатеричной форме только положительные значения задаются?

Kogrom
()
Ответ на: комментарий от Kogrom

Почему битность повлияла если в шестнадцатеричном представлении знак не важен?

Если совсем на пальцах, то в 2-complement arithmetic -INT_MIN отображается сам в себя. Как и ноль собственно. Вопрос то в чём?

bugfixer ★★★★
()
Ответ на: комментарий от bugfixer

Это понятно. Сомнение в утверждении, что в шестнадцатеричной форме не может быть отрицательных зачений.

Kogrom
()
Ответ на: комментарий от bugfixer

в 2-complement arithmetic -INT_MIN отображается сам в себя.

Следует ли компилятору в этом случае диагностировать переполнение?

anonymous
()
Ответ на: комментарий от Kogrom

Какой тогда смысл в утверждении, что в шестнадцатеричной форме только положительные значения задаются

Никакого. Я написал не то.

Тип литерала в hex форме будет первый тип, который подойдёт из списка.

  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int
  • unsigned long long int

0x80000000 = 2147483648

2147483648 не входит в int, поэтому выбирается unsigned int.

https://en.cppreference.com/w/cpp/language/integer_literal

fsb4000 ★★★★★
()
Ответ на: комментарий от anonymous

Сомнение в утверждении, что в шестнадцатеричной форме не может быть отрицательных зачений.

Вопрос исключительно в типе hex literals. Уважаемый @fsb4000 утверждает что оно unsigned. Я если честно - не помню, поэтому и всегда сопровождаю суффиксом ‘U’. Присвойте в int (на 32 или 64 битах) получите свой «минус».

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от fsb4000

первый тип, который подойдёт из списка.

А, ну вот, трошки сложнее, но оправдывает мою привычку быть explicit with the intent as much as possible.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от fsb4000

There are no negative integer literals. Expressions such as -1 apply the unary minus operator to the value represented by the literal, which may involve implicit type conversions.

В общем, да. Отрицательных литералов вообще не бывает. В любой форме.

Kogrom
()
Ответ на: комментарий от anonymous

Следует ли компилятору в этом случае диагностировать переполнение?

Я считаю - однозначно. Если нет explicit cast.

bugfixer ★★★★
()

с намеком на завалить кандидата — неочевидные или на хорошее знание стандарта.

Ну не обязательно неочевидные.

Просто даю на листочке код где обявлен массив из 10-ти элементов и присваивание значения элементу по индексу 10. Спрашиваю что тут не так - отсеивается больше половины. Ну и 2+2*2 того же порядка.

eagleivg ★★★★★
()
Последнее исправление: eagleivg (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Как человек через которого прошли сотни людей позволю себе смелость заявить: (а) задачи «завалить» в принципе не должно стоять

Это способ не напрямую отказать неадеквату.

eagleivg ★★★★★
()
Ответ на: комментарий от eagleivg

Это способ не напрямую отказать неадеквату.

По факту много (очень много) отсеивается на pre-screening. Т.е. люди с которыми я разговариваю уже должны «что-то понимать в этой жизни». Проблема в том что мы бы может и рады были бы нанять, так нЕкого. У меня даже разнарядка «понижать планку» спущена сверху, а толку…

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

задачи «завалить» в принципе не должно стоять

У меня начальство просило какой-то формальный признак для сравнения кандидатов. Соответственно, я сделал тест с десятью маленькими примерами кода, в которых были проблемы, и кандидат должен был их найти и объяснить. Но там было проще, типа на знание, что в си строки нулём заканчиваются. Могу пару таких примеров вспомнить.

if(a > b > c) some_func();
for(i = 0; i < n; i++);
    some_func();

Что касается именно Embedded, то я спрашивал про работу АЦП, ЦАП, протоколов передачи данных типа UART, SPI. Это чтобы разговорить, понять что человек реально работал с микроконтроллерами. Если надо крутого спеца, то спрашивать про I2C, CAN, USB, Ethernet.

Kogrom
()
Ответ на: комментарий от bugfixer

У меня даже разнарядка «понижать планку» спущена сверху, а толку

Вероятно, вакансия скучная, вот и приходит всякий сброд. Надо чем-то интересным завлекать, если зарплату выше предложить не получается. На вакансию, связанную с машинным зрением, у нас намного больше пришло толкового народа, чем на вакансию, связанную просто с микроконтроллерами.

Kogrom
()
Ответ на: комментарий от eagleivg

Странные к тебе люди приходят. Такое даже для джуна слишком.

untitl3d
() автор топика
Ответ на: комментарий от untitl3d

Это си или плюсы? Я про си спрашивал.

И в чём разница?

Вроде таблички одинаковые для hexadecimal литерала без суффикса.

https://en.cppreference.com/w/c/language/integer_constant

https://en.cppreference.com/w/cpp/language/integer_literal

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Я не знаю плюсов и что они там под ковром делают тоже не знаю. Может и нет разницы, а ссылки были на cpp.

untitl3d
() автор топика
Ответ на: комментарий от bugfixer

Я, например, узнал
спустя лет 15ти плотненькой такой разработки
после того как оно выстрелило в проде.
И что?

Тот неловкий момент, когда системное программирование превращается в веб-макакинг.

LamerOk ★★★★★
()
Ответ на: комментарий от UVV

Спросить что человек писал в озвученных в резюме проектах.

Спасибо за хороший вопрос! В озвученных в резюме проектах я писал код. У вас ещё остались какие-то вопросы?

filosofia
()
Ответ на: комментарий от bugfixer

Я, например, узнал что signed integer overflow is an UB спустя лет 15ти плотненькой такой разработки и многих сотен тысяч строк кода, к сожалению после того как оно выстрелило в проде. И что?

значит ты плохой программист

у хорошего оно бы в проде не выстрелило

Harald ★★★★★
()
Ответ на: комментарий от Harald

Не знаю, может я всю жизнь общаюсь с натуральными обезьянами, но ещё не видел программиста, у которого что-нибудь не выстрелило бы на проде.

filosofia
()
Ответ на: комментарий от UVV

и ещё показать нужное место в исходниках на гитхабе :)

Harald ★★★★★
()
Ответ на: комментарий от filosofia

что-нибудь другое бы выстрелило, не это :)

Harald ★★★★★
()
Ответ на: комментарий от filosofia

Это ошибка не возможна в современных C/C++, потому что санитайзеры просто крашат приложение.

https://gcc.godbolt.org/z/oq95PeboP

google сделав санитайзеры очень помог экосистеме С/С++. Хорошо что gcc и MSVC интегрировали код от google в свои комплиляторы…

fsb4000 ★★★★★
()
Ответ на: комментарий от Harald

значит ты плохой программист

Возможно. Как это формально измерить?

у хорошего оно бы в проде не выстрелило

Один довольно умный человек как-то сказал: «мы даём безусловную гарантию что в нашем софте есть баги» (происходило при обсуждении контракта на поддержку с клиентом). От себя могу добавить что я даже единственного безглючного HelloWorld не видел, что уж говорить о multi-MLOC проектах.

bugfixer ★★★★
()
Ответ на: комментарий от Harald

Правильно. Чтобы завалить, надо спрашивать справочные данные, которые нет смысла запоминать.

anonymous
()
Ответ на: комментарий от fsb4000

Эта ошибка не возможна в современных C/C++, потому что санитайзеры просто крашат приложение.

Вы только что опровергли теорему Тьюринга. И в runtime все варианты входных данных заранее проверить невозможно.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

ну одно дело баги по невнимательности, это у всех бывает

другое дело баги от незнания матчасти

второе хуже

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.