Судя по всему, когда xmm регистров ещё не было, или в других ABI, va_arg функции были совместимы с обычными. То есть, можно было их вызывать через указатель на обычную функцию, или делать объявления с фиксированным количеством аргументов. Потом появился SSE и это стало UB.
Да, возможно надо было более явно указать для какой конфигурации проводился обзор. С другой стороны, для других x86_64 компиляторов выводы будут примерно такие же. ABI и стандарт С++ накладывают ограничения.
На 20 странице pdf описываются особенности при переменном числе аргументов. Суть в том, что в регистре `al` передаётся число используемых xmm регистров. Остальное то же самое. Внутри метода абсолютно все регистры, в которых могут быть аргументы, копируются на стек, после чего читаются из него по смещению.
Кстати, ` reinterpret_cast(accumulateFunction);` является UB:
The effect of calling a function through a pointer to a function type that is not the same as the type used in the definition of the function is undefined.
Если посмотреть на ассемблер, то видно, что регистр `al` не очищается при вызове через указатель, то приводит, собственно, к UB.
Ага, изменил формулировку. Я имел ввиду, что обычно нельзя изменить данные вообще не используя регистры. Тот же ADD не работает для двух memory операндов.
Увы, в `станки ->… -> самосохранение`, за `...` кроется весьма сложная причинно-следственная цепочка. Для понимания которой требуется думать головой. Зачастую у нас она вообще пропускается, и образуются карго-культы вроде «демократии»: `выборы ->… -> демократия ->… -> процветание`.
что-то идет в пользу или во вред стране
К сожалению, как и в любой задаче с не бинарным пространством решений, какое-либо случайное действие с подавляющей вероятностью принесёт вред, нежели пользу. Чтобы решение было верным, необходимо целенаправленно прикладывать для этого усилия. Соответственно, сейчас все действия власти направлены на бездействие. Правда, как показывает практика, подобная стратегия в перспективе ведёт к не очень приятным результатам.
Увы, исследования показывают, что стало бы намного хуже. Чем больше риск, тем больше должна быть выгода. Если бы мошенников рвали на площадях, то они бы забирали у своих жертв всё и не оставляли живых свидетелей. Чтобы посмотреть, как такой подход работает на практике, можно сравнить зависимость строгости наказания за наркоторговлю с количеством связанных с ними преступлений.
Богатые люди не финансируют такие исследования потому, что они, в большинстве своём, так же глупы и недальновидны, как и остальные. Богатство мало коррелирует с интеллектом, даже в странах «первого мира». Чтобы просто дойти до мысли, что старение и смерть являются чем-то плохим, нужно пройти немалую дистанцию. Особенно в обществе, где все будут смотреть на тебя, как на идиота, или даже как на фрика, с такими мыслями. Сейчас только начинают вестись дебаты по на тему «whether or not aging can be classified as a disease» [1][2], без чего тестирование каких-либо перспективных лекарств сильно осложнено.
Тут проблема в наличии любопытства. Я вот представляю, чем занять себя на столетия, в предположении, что можно не отвлекаться на всякие низменные проблемы.
В дискуссию нужно вступать не с фанатиками, а с их аудиторией.
О таких списках, в первую очередь, должна знать широкая аудитория. И должно быть желание ими пользоваться.
Так и представил, как рен-тв соглашается сделать ревью передачи про плоскую землю перед её показом.
И кто их будет штрафовать? Правительство? :-) Телекомпании? У них в приоритете не просветительство, а аудитория. А аудитория такое любит.
Большинству вообще без разницы, круглая она, квадратная, или ещё какой-то формы. На их повседневные заботы это никак не влияет. Если Земля окажется квадратной, у них ничего в жизни не поменяется.
"Пропагандировать критическое мышление и правильные энциклопедии" — у нас и так сплошная пропаганда и правильные книги.
github.com/woboq/verdigris
У автора в блоге (https://woboq.com/blog/), кстати, много всего интересного написано про нестандартное использование C++.
Судя по всему, когда xmm регистров ещё не было, или в других ABI, va_arg функции были совместимы с обычными. То есть, можно было их вызывать через указатель на обычную функцию, или делать объявления с фиксированным количеством аргументов. Потом появился SSE и это стало UB.
Если скомпилировать с оптимизацией (хотя бы
-O1), то не делает:GCC, кстати, хитрый. Если в функции не вызывается
va_arg(args, double);, то он даже не проверяет регистрal.Иначе не получится в цикле считывать неизвестное количество аргументов. Если они все на стеке, то можно просто читать
[rsp, rsp+sizeof(arg)).Кстати, ` reinterpret_cast(accumulateFunction);` является UB:
Если посмотреть на ассемблер, то видно, что регистр `al` не очищается при вызове через указатель, то приводит, собственно, к UB.
«если у вас есть нескольких булевых флагов, хранящих состояние программы, то, скорее всего, она является замаскированным конечным автоматом.»
К сожалению, как и в любой задаче с не бинарным пространством решений, какое-либо случайное действие с подавляющей вероятностью принесёт вред, нежели пользу. Чтобы решение было верным, необходимо целенаправленно прикладывать для этого усилия. Соответственно, сейчас все действия власти направлены на бездействие. Правда, как показывает практика, подобная стратегия в перспективе ведёт к не очень приятным результатам.
А можете получить, например, что-то совершенно противоположное.
В дискуссию нужно вступать не с фанатиками, а с их аудиторией.