Date: 2016-08-11 01:17 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Ага. Уволишь ты его. А через двадцать лет появится новая архитектура, и код внезапно перестанет работать.

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

Причем когда я году в 95 это писал, оно совершенно не казалось черной магией - в DOS все так делали.

(а как я в турбпопаскалевских real mode указателях прятал целый байт дополнительной информации... Мог бы и 12 бит, но решил не жадничать).

Date: 2016-08-11 01:18 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Перед увольнением все такие хаки заставить переписать.

Date: 2016-08-11 01:26 pm (UTC)
From: [identity profile] b00ter.livejournal.com
А он сам половину не вспомнит. И переписывать не будет, ибо если работает - трогать нельзя. И, вообще, какой смысл...

Date: 2016-08-11 01:28 pm (UTC)
vitus_wagner: My photo 2005 (white)
From: [personal profile] vitus_wagner
Их тебе ни один lint не выловит.

Date: 2016-08-11 01:37 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
Разве на строчку "double (*IntPowerOfDouble)(int, double) = (double (*)(int, double))&DoubleToTheInt;"

воринга не кинет, что "ты, хозяин, в своем праве так делать - но то что ты делаешь небезопасно"?

Date: 2016-08-11 01:40 pm (UTC)
From: [identity profile] mikeiva.livejournal.com
Вот из-за того, что в C и его логических продолжениях возможна подобная фигня, они мне и не нравятся.

(и неочевидной читаемости традиционного для него кода тоже - со всеми этими указателями на места, где лежат указатели на места, где лежат фактические параметры и т.п. - ну или хотя бы той картинки программистского юмора про = вместо ==, которую сегодня все репостят в фэйсбуке).

Date: 2016-08-11 01:44 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Не, ну указатели куда понятнее, чем "Передача параметров по ссылке и по значению" из учебника по Pascal.

Подобная фигня возможна только в низкоуровневых языках, но в более высокоуровневых свои погремушки.

Date: 2016-08-11 01:49 pm (UTC)
From: [identity profile] mikeiva.livejournal.com
Не знаю, мне кажется, паскалевская запись абсолютно прозрачна. Стоит var в описании параметра функции - будет у тебя после функции измененное внутри значение. А типичное msdn-овское описание требует получаса приседаний в попытках понять, как, что и куда надо пихать. Ну, у меня, во всяком случае.

Date: 2016-08-11 01:55 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
А почему на таком уровне нельзя считать, что вместо "var" в объявлении функции стоит *, а при вызове - & ?

Более глубоких наворотов в стандартном паскале вроде бы не ыбо?

Или проблема как раз в том, что в Си можно много чего нетривиального соорудить, средвста языка позволяют а не дают по рукам?

Date: 2016-08-11 02:09 pm (UTC)
From: [identity profile] mikeiva.livejournal.com
>А почему на таком уровне нельзя считать, что вместо "var" в объявлении функции стоит *, а при вызове - & ?

Я имел в виду ситуацию, когда зачем-то передают не ссылку на место хранения данных, а ссылку на ссылку. Сходу, правда, не вспомнил, где именно мне такое попадалось.

>Или проблема как раз в том, что в Си можно много чего нетривиального соорудить, средвста языка позволяют а не дают по рукам?

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

Date: 2016-08-11 02:18 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
> Я имел в виду ситуацию, когда зачем-то передают не ссылку на место хранения данных, а ссылку на ссылку. Сходу, правда, не вспомнил, где именно мне такое попадалось.

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

Или вариант когда надо получить отсортированный по какому-то критерию список объектов, которые нельзя физически реаллокировать (скажем, слишком большие), и каждый содержит какие-то массивы.

В обоих случаях перехлж на плюсы и объекты проблему маскирует, но не решает.

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

Я думаю, что для большинства применений утверждение если и не 100% справедливо, то близко к этому:) Но есть отдельные направления, где без таких возможностей тяжело, и где программисты обычно обладают квалификацией и самодисциплиной:)

Может быть скажу ересь, но в отличии от ситуации 20-ти летней давности и С, и С++ - нишевые языки, в большинстве случаев вместо них стоит использовать языки более высокого уровня.

Date: 2016-08-11 03:09 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
А, и кстати. "слабочитаемый код" - это одно явление, "код, позволяющий легко и незаметно для себя получить ошибку/неопределенное поведение" - другое, а "код, не обладающий первыми двумя недостатками, но выглядящий непонятно программисту, не знакомому с принятыми при написании конвенциями" - вообще третее.

Date: 2016-08-11 09:22 pm (UTC)
From: [identity profile] mikeiva.livejournal.com
>Я думаю, что для большинства применений утверждение если и не 100% справедливо, то близко к этому:) Но есть отдельные направления, где без таких возможностей тяжело, и где программисты обычно обладают квалификацией и самодисциплиной:)

Да, вполне возможно.
Просто мне в свое время пришлось разбираться со здоровым куском кода (несколько сотен строк, в каждую из которых было напихано,в лучшем случае, всего лишь несколько операторов - а не десятка полтора, скажем), написанных таким вот любителем, э, программистских лайфхаков (это был не си, а mumps, если что) - мне надо было в него функционал добавить. Степень моего счастья от этой задачи, скажем так, было сложно недооценить :) Поэтому я числю себя большим фанатом понятного кода :)

Date: 2016-08-11 09:38 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
Дурак и известно что сломать может;)

Date: 2016-08-11 02:32 pm (UTC)
yurikhan: (default)
From: [personal profile] yurikhan

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

HRESULT QueryInterface(/*in*/ IUnknown* this_, /*in*/ UUID* riid, /*out*/ void** ppvObject);

Date: 2016-08-11 01:51 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
Ну, это как Unforgivable Curses. Применять нельзя, но знать, в рамках курса Defense Against the Dark Arts, обязательно.

Date: 2016-08-11 01:58 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Непростительные проклятия хотя бы все известны. А как нагуглить причины работы такого хака, увидев его в коде, я не представляю.
Edited Date: 2016-08-11 02:02 pm (UTC)

Date: 2016-08-11 02:25 pm (UTC)
yurikhan: (default)
From: [personal profile] yurikhan

Ну не знаю, я посмотрел на код, сказал «а, ну да, calling convention: целые ходят через один набор регистров, плавающая точка через другой». Потом пошёл по ссылке и получил подтверждение гипотезы.

Знания о ABI, если не изучать целенаправленно, появляются из сеансов отладки/декомпиляции чего-нибудь в условиях, когда исходник и/или отладочная информация недоступны.

Date: 2016-08-11 01:52 pm (UTC)
From: [identity profile] gornal.livejournal.com
А ведь это не умолчание, кто-то эту логику придумал, есть специальный код, который это реализует. Вот где ужас-то.
Edited Date: 2016-08-11 01:53 pm (UTC)

Date: 2016-08-11 02:02 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Если ты прочитаешь статью, то увидишь, что специальный код реализует логику передачи аргументов через регистры, из которых одни используются для double, другие для int, и эти наборы не пересекаются. В общем, даже логично - через регистры быстрее, чем через стэк. А дальше уже это (не вполне документированное и не кроссплатформенное) поведение начинают использовать.

Date: 2016-08-11 02:12 pm (UTC)
From: [identity profile] gornal.livejournal.com
Опс. Мир значит не так плох :-)

Date: 2016-08-11 02:21 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
"Начинают использовать" в реальном коде, или исследователь нашел пример, как можно фактически хакнуть компилятор? Условно, если я обнаружу что в моем автомобиле одновнременное нажатеи газа, тормоза и дальнего света в течении 3 секунд включает правый поворотник - это же еще не значит, что я буду использовать такой способ сигнализации другим водителям :)

Или что, пример реально выловлен из какого-то рабочего проекта?!

Date: 2016-08-11 02:25 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Не признаётся. Во всяком случае, в статье не пишет.

Провел проверку:)

Date: 2016-08-11 02:39 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
Старенький Visual Studio под виндой сломался на "кривом" вызове (вместо правильного ответа выдал #INF,

под юниксом gcc купился:(

Date: 2016-08-11 04:50 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Расстрелять не расстрелять, но канделябром по голове…

Date: 2016-08-11 06:23 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Угу. А потом - расстрелять.

Profile

beldmit: (Default)
beldmit

October 2017

S M T W T F S
1234567
8 910 11 121314
1516 1718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 18th, 2017 02:05 am
Powered by Dreamwidth Studios