Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

о началах программирования

(эта запись будет интересна лишь программистам и сочувствующим)

Из недавно обнаруженного бага в дистрибутиве Линукса Федора сложилась очень поучительная история, которую на мой взгляд неплохо бы преподавать в университетах, на уроках программирования, чтобы объяснять студентам не только как ключевые слова писать, но и как работать вместе с другими программистами и проектами. Чтобы видели, как нужно делать, и как нельзя. Эта полезная история - как бесплатный мастер-класс, проведенный Линусом Торвальдсом. И если вам непонятно в ней, на чьей стороне правда, или вам кажется, что она на стороне разработчиков Федоры и glibc, то вы - часть проблемы.

Вот краткий пересказ этой истории.

Функция memcpy(dst, src, size), как известно, копирует блок памяти размером size, начиная с адреса src, в адрес dst. Иными словами, она копирует регион src----->src+size в регион dst---->dst+size. Что будет, если эти два региона пересекаются? что, действительно?Collapse )

Это была присказка. А сказка начинается прошлым летом, когда в исходники glibc внесли существенное изменение в код memcpy(), предложенное программистами из Интела. Новая версия memcpy() на некоторых процессорах при некоторых условиях копирует регионы от конца к началу, а при других условиях - от начала к концу. На других процессорах она как и раньше всегда копирует от начала к концу. Все эти сложные изменения должны были ускорить memcpy(), и вполне возможно, что они добились этой цели, хотя точных и убедительных измерений я так и не нашел. В Интеле работают хорошие программисты, но грамотная оптимизация такого рода - задача непростая и не всегда легко понять, что лучше.

Формально говоря, это изменение не противоречит стандарту. Но на практике оказалось, что во многих программах есть вызовы memcpy(), в которых регионы пересекаются тем путем, что работает нормально в традиционной имплементации. А в новой, при копировании от конца к началу, выходит ошибка. Но не всегда, а лишь на некоторых процессорах и в некоторых условиях. И пока что никто этого еще не знает, в конце июня прошлого лета. и вот тут начинается Хронология Одного Бага...Collapse )
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 605 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →