Я вам перечислил пункты, которые считаю посылами статьи. Если крупица о логическом use-after-free для вас не является новостью - поздравляю!
Лично я всегда нахожу даже мельчайшие нюансы чужих опусов интересными и оставляющими некое новое впечатление и простор для мыслей.
Но все люди разные, у кого-то струны контрабаса, у кого-то - скрипки. Кто-то резонирует от мельчайших колебаний, для кого-то и слон в комнате - не новость.
Я на досуге имел возможность немного поучаствовать в коммерческом проекте на Rust с открытым кодом. Оказалось, что файлы сборки ровно такие же, как в маленьких проектах, зависимости - все те же, только их больше, а сам код сильно напоминает то, что писал я в своих домашних подельях.
В общем, вкатиться и понять это можно было за считанные дни. Конечно, много зависит от авторов проекта, но я для себя вынес одно слово, которым охарактеризовал этот опыт: "единообразие". Код на Rust с первого дня кажется знакомым, в нем на порядок проще ориентироваться в сравнении с C++. На плюсовых проектах всегда ощущение, что тебя окунули в чан с... с ледяной водой, допустим, и заставили в нем барахтаться.
Я с вами согласен, что рутина будет везде, усталость и раздражение будут накапливаться от любой работы, но даже первое впечатление от серьезного проекта на Rust разительно отличалось от такового для проектов на C++.
Я в параллельной ветке привел пример, из которого прямо следует, что графы исполнения для физического и логического use-after-free изоморфны, а, значит, если вы признаете существование физического use-after-free, то следеут уже признать и существование его логического эквивалента в C++.
метод_1 на тысячу строк перемещает один из своих аргументов в метод_2 где-то в середине своего тела. Мне понадобился доступ к этому аргументу сильно ниже в методе_1. Хорошо, что я имею годами выработанную привычку обмазывать все неизвестные мне вещи ассертами. Я поймал ошибку на CI.
Я даже знаю, как мы к этому пришли: когда-то метод_1 был небольшим, а в методе_2 нужно было изменять переданный аргумент, поэтому его принимали по значению. Логичным решением было переместить имеющийся в методе_1 аргумент. Потом метод_1 отрос подробностями, но код продолжал работать. Пока не пришел тот, кому нужно было этот аргумент зачем-то использовать.
А теперь я вам расскажу два альтернативных сценария:
Вместо одиночного объекта в метод_1 приходит коллекция. Искушение переместить ее значительно возрастает. Но с коллекцией проблема серьезней: очень часто пустая коллекция - это вполне норма. Поди разберись, нужно ли вставлять в коде где ни попадя assert(!vec.empty()); или же оно выстрелит на абсолютно валидном сценарии.
Вместо объекта передаем указатель на выделенную на куче память и где-то в методе_2 освобождаем ее за ненадобностью. Можно даже предположить, что мы имеем std::unique_ptr и перемещаем его. Хотя для такого случая я, скорее всего, задался бы вопросом, почему именно такой формат аргумента, и мог бы предположить, что по дороге он может быть освобожден.
Из хорошего: именно на этом примере у меня сформировалась аналогия логического use-after-free, описанная в тексте.
И какова эта связь в геометрическом смысле? Пересечение диагоналей ромба?
Мы доказали теорему Пифагора, не нарисовав ни одного прямоугольного треугольника.
И как вы поняли, что это теорема Пифагора?
Я правда не могу уяснить сути данных манипуляций, потому что они имеют чисто алгебраический, но не геометрический смысл. Хотя утеря геометрического смысла изначально и ставилась в вину современным подходам в доказательствах.
Испанский - сложный язык. 3 месяца - очень мало. При этом описаны все типичные ошибки самообучающихся. Попробуйте:
Не гоняться за рейтингом, а учиться на качество, то есть медленно
Каждую непонятную фразу пытаться осмыслить с точки зрения грамматики
Если знаний грамматики не хватает - поискать и почитать правила
Слушать всегда в наушниках - услышите, сколько фонетических тонкостей есть в произношении
Не смотреть сразу на блоки слов для перевода, а переводить сначала в уме
Повторять фразы и даже тексты на аудировании - вы удивитесь, как сложно точно запомнить и воспроизвести даже 10 слов за диктором
Учить не слова, а фразы и выражения - словоупотребление важно в контексте
Проходить испытания на время - они учат думать на языке быстрее
Я учу испанский с дуо 4 года (1300 дней было позавчера) и у меня уровень примерно В2+. Первый год было очень сложно и хотелось бросить. После полутора лет брал порядка 25 индивидуальных занятий, так мне преподаватель сказала, что удивлена чистотой и качеством знания языка, особенно от человека, занимающегося только по дуолинго. При этом я более выдающегося прогресса с преподавателем по сравнению с дуо не увидел, поэтому продолжать с ней не стал.
Язык учится медленно. Люди вообще медленно учатся - медленнее, чем им самим того бы хотелось. Найдите свой ритм, не ставьте сверхцелей и у вас все получится.
Я вам перечислил пункты, которые считаю посылами статьи. Если крупица о логическом use-after-free для вас не является новостью - поздравляю!
Лично я всегда нахожу даже мельчайшие нюансы чужих опусов интересными и оставляющими некое новое впечатление и простор для мыслей.
Но все люди разные, у кого-то струны контрабаса, у кого-то - скрипки. Кто-то резонирует от мельчайших колебаний, для кого-то и слон в комнате - не новость.
Я же в самом первом пункте вам сказал: возможно, конкретно эта пища не в вашем вкусе.
И да: в нашем варианте диалога действительно не получится. Спасибо за внимание!
Я могу вам предложить несколько посылов на выбор:
Любой осмысленный текст - это пища для ума. Возможно, конкретно эта пища не в вашем вкусе.
Текст призывает задуматься и понять, что в професии важно лично вам.
Иногда проблема действительно не в вас, а в окружении.
Диалог возможен, но только при взаимном интересе сторон к такому диалогу. Отсюда и оговорка о "скорее всего".
Иногда просто не стоит искать посыла, а насладиться формой, подачей и хорошо проведенным временем.
Я на досуге имел возможность немного поучаствовать в коммерческом проекте на Rust с открытым кодом. Оказалось, что файлы сборки ровно такие же, как в маленьких проектах, зависимости - все те же, только их больше, а сам код сильно напоминает то, что писал я в своих домашних подельях.
В общем, вкатиться и понять это можно было за считанные дни. Конечно, много зависит от авторов проекта, но я для себя вынес одно слово, которым охарактеризовал этот опыт: "единообразие". Код на Rust с первого дня кажется знакомым, в нем на порядок проще ориентироваться в сравнении с C++. На плюсовых проектах всегда ощущение, что тебя окунули в чан с... с ледяной водой, допустим, и заставили в нем барахтаться.
Я с вами согласен, что рутина будет везде, усталость и раздражение будут накапливаться от любой работы, но даже первое впечатление от серьезного проекта на Rust разительно отличалось от такового для проектов на C++.
Я в параллельной ветке привел пример, из которого прямо следует, что графы исполнения для физического и логического use-after-free изоморфны, а, значит, если вы признаете существование физического use-after-free, то следеут уже признать и существование его логического эквивалента в C++.
У меня однажды было так:
метод_1 на тысячу строк перемещает один из своих аргументов в метод_2 где-то в середине своего тела. Мне понадобился доступ к этому аргументу сильно ниже в методе_1. Хорошо, что я имею годами выработанную привычку обмазывать все неизвестные мне вещи ассертами. Я поймал ошибку на CI.
Я даже знаю, как мы к этому пришли: когда-то метод_1 был небольшим, а в методе_2 нужно было изменять переданный аргумент, поэтому его принимали по значению. Логичным решением было переместить имеющийся в методе_1 аргумент. Потом метод_1 отрос подробностями, но код продолжал работать. Пока не пришел тот, кому нужно было этот аргумент зачем-то использовать.
А теперь я вам расскажу два альтернативных сценария:
Вместо одиночного объекта в метод_1 приходит коллекция. Искушение переместить ее значительно возрастает. Но с коллекцией проблема серьезней: очень часто пустая коллекция - это вполне норма. Поди разберись, нужно ли вставлять в коде где ни попадя assert(!vec.empty()); или же оно выстрелит на абсолютно валидном сценарии.
Вместо объекта передаем указатель на выделенную на куче память и где-то в методе_2 освобождаем ее за ненадобностью. Можно даже предположить, что мы имеем std::unique_ptr и перемещаем его. Хотя для такого случая я, скорее всего, задался бы вопросом, почему именно такой формат аргумента, и мог бы предположить, что по дороге он может быть освобожден.
Из хорошего: именно на этом примере у меня сформировалась аналогия логического use-after-free, описанная в тексте.
И какова эта связь в геометрическом смысле? Пересечение диагоналей ромба?
И как вы поняли, что это теорема Пифагора?
Я правда не могу уяснить сути данных манипуляций, потому что они имеют чисто алгебраический, но не геометрический смысл. Хотя утеря геометрического смысла изначально и ставилась в вину современным подходам в доказательствах.
Испанский - сложный язык. 3 месяца - очень мало. При этом описаны все типичные ошибки самообучающихся. Попробуйте:
Не гоняться за рейтингом, а учиться на качество, то есть медленно
Каждую непонятную фразу пытаться осмыслить с точки зрения грамматики
Если знаний грамматики не хватает - поискать и почитать правила
Слушать всегда в наушниках - услышите, сколько фонетических тонкостей есть в произношении
Не смотреть сразу на блоки слов для перевода, а переводить сначала в уме
Повторять фразы и даже тексты на аудировании - вы удивитесь, как сложно точно запомнить и воспроизвести даже 10 слов за диктором
Учить не слова, а фразы и выражения - словоупотребление важно в контексте
Проходить испытания на время - они учат думать на языке быстрее
Я учу испанский с дуо 4 года (1300 дней было позавчера) и у меня уровень примерно В2+. Первый год было очень сложно и хотелось бросить. После полутора лет брал порядка 25 индивидуальных занятий, так мне преподаватель сказала, что удивлена чистотой и качеством знания языка, особенно от человека, занимающегося только по дуолинго. При этом я более выдающегося прогресса с преподавателем по сравнению с дуо не увидел, поэтому продолжать с ней не стал.
Язык учится медленно. Люди вообще медленно учатся - медленнее, чем им самим того бы хотелось. Найдите свой ритм, не ставьте сверхцелей и у вас все получится.