Однако это не отменяет того факта, что поведение вашей стороны тоже не совсем корректно: тут либо реакция должна быть такой же как на отсутствие тега CNAME вообще, скорее всего -- отказ в установлении соединения -- либо принять, и использовать его как есть -- то есть пустое значение это всё же значение.
Вы провели отличное глубокое расследование и нашли очень редкий случай, который обычно поймать можно только с помощью удачи (и/или фаззинга), теперь стоит сделать вывод и принять решение как реагировать на него с вашей стороны. :)
Чего точно не стоит делать -- так это хоронить проблему и забить.
"RTCP carries a persistent transport-level identifier for an RTP source called the canonical name or CNAME, Section 6.5.1. Since the SSRC identifier may change if a conflict is discovered or a program is restarted, receivers require the CNAME to keep track of each participant. Receivers may also require the CNAME to associate multiple data streams from a given participant in a set of related RTP sessions....
То есть CNAME необходим для уникального идентифицирования абонента в случае смены SSRC или наличия множества стримов.
Да, CNAME обязан быть передан -- и он передан, в пункте 6.5.1 я не вижу ничего, что делало бы пустую строку невалидной.
Как видим, CNAME не указан - нет текста с ним, а длина элемента 0 бит.
Строго говоря, CNAME указан -- пустая строка. Так как в звонке два абонента, у второго непустая строка, то все требования соблюдены -- у каждого есть CNAME и они уникальны для каждого абонента.
Я запомнил момент из разговора со службой безопасности (реальной) постфинанса тут. Звонок шел с неизвестного номера (и номер не гуглился, но на единицу отличался от их КЦ). В общем, в какой-то момент попытка идентифицировать друг друга уперлась в стену: я не хочу называть никакую сумму по своим счетам-транзакциям ибо я их не знаю, они не могут назвать со своей стороны никакую сумму чтоб не раскрыть мои личные данные если что 3им лицам...
В общем, просто выслали мне новую карту по почте, и сказали проверить транзакции самому, если что -- через онлайнбанк подать заявку на опротестовывание их :D
Показывает на качество покрытия тестами. То есть часть эвристик есть, но не покрыто полноценно регрессами... Скорее всего, это практически невозможно, потому и.
И контейнеры позволяют ручную реаллокацию. В отличие от ручного realloc() -- безопасно и аккуартно.
Есть контейнеры, которые уже реализуют варианты кусочно-линейных представлений, есть контейнеры, предоставляющие цельные куски по требованию, есть списки и деревья разных цветов и пород.
Вы правда утверждаете, что ручное выделение, которое написали вы сами, будет работать лучше ручного выделения, которое написал кто-то другой?
Или ваша ручная реализация спокойно поменяет 200 тысяч на 300 миллионов вершин магическим образом, не уходя в никакой лаг?.. Сами же говорите, что нет. Так к чему этот пример был?
Да блин, посмотрите любые потроха контейнерных классов. Или там просто так, пару сотен тысяч строк кода ?
Я их видел много кратно. Нет, не просто так. Однако активное использование шаблонов и constexpr -- позволяют оплатить их во время компиляции. unique_ptr делает кучу проверок... Которых не остаётся в скомпилированом коде. Вот простейший синтетический пример: https://godbolt.org/z/ePE68Pob3
Вы вообще знаете, что к примеру, для игр, используют не просто "сырые" указатели, а вообще, самопальные версии "new/malloc" (ну, понятное дело, с нужной обвязкой)?
"Свой аллокатор" это очень полезная штука, не только в геймдеве. Причем код, работающий на контейнерах, прекрасно можно переиспользовать в одном приложении сразу используя с разными аллокаторами без ручного управления.
Поучительно.
Да, вам стоит почитать исходники и посмотреть на результат компиляции. Это действительно поучительно.
Действительно есть места, где стандартные контейнеры не подходят, но ответ почему не подходят должен быть осмысленен, оценен и подтвержден -- а не просто проекция страхов на уровне "кто-то там когда-то во времена атлона напел".
А можно не "на глаз" а с примером? Повторюсь: оплата идёт в момент компиляции при аккуратном применении. Тот же unique_ptr буквально компилируется в один указатель, никакой разницы с сырым указателем нет от слова совсем. std::array<X> ничем не отличается от X[], кроме дополнительной безопасности и контроля во время компиляции. Какие именно контейнеры уступают чему именно, можно примеры? А то попахивает что перемножаем яблоки на апельсины и жалуемся что на выходе лампальсины.
А если говорить про "чудесный геймдев"... Я вот вижу насколько блюпринты медленнее си -- и ведь не сказать что все бросили все блюпы нафиг и обходят их за километр, да?
Я уверен, что это был баг на той стороне.
Однако это не отменяет того факта, что поведение вашей стороны тоже не совсем корректно: тут либо реакция должна быть такой же как на отсутствие тега CNAME вообще, скорее всего -- отказ в установлении соединения -- либо принять, и использовать его как есть -- то есть пустое значение это всё же значение.
Вы провели отличное глубокое расследование и нашли очень редкий случай, который обычно поймать можно только с помощью удачи (и/или фаззинга), теперь стоит сделать вывод и принять решение как реагировать на него с вашей стороны. :)
Чего точно не стоит делать -- так это хоронить проблему и забить.
https://xkcd.com/221/
Если пустое поле только у одного абонента в разговоре -- да, "" -- уникально. Так же как уникально "вася" или "пыопрырц8процр".
Должно работать в каком смысле?
То есть CNAME необходим для уникального идентифицирования абонента в случае смены SSRC или наличия множества стримов.
Да, CNAME обязан быть передан -- и он передан, в пункте 6.5.1 я не вижу ничего, что делало бы пустую строку невалидной.
Строго говоря, CNAME указан -- пустая строка. Так как в звонке два абонента, у второго непустая строка, то все требования соблюдены -- у каждого есть CNAME и они уникальны для каждого абонента.
Просто оставлю это здесь: https://www.thelocal.ch/20171220/swiss-court-convicts-woman-for-reading-husbands-emails
Однако же на входящий звонок ответить можно без кода.
а если
while (*from++ = *to++)? :)Сегодня я что-то новое изучил: O_O https://pernos.co/blog/tzcnt-portability/
В отсутсвии чего бы то ни было еще, gcc/clang компилируют в rep bsf: https://godbolt.org/z/38arb3x8r
Я запомнил момент из разговора со службой безопасности (реальной) постфинанса тут. Звонок шел с неизвестного номера (и номер не гуглился, но на единицу отличался от их КЦ). В общем, в какой-то момент попытка идентифицировать друг друга уперлась в стену: я не хочу называть никакую сумму по своим счетам-транзакциям ибо я их не знаю, они не могут назвать со своей стороны никакую сумму чтоб не раскрыть мои личные данные если что 3им лицам...
В общем, просто выслали мне новую карту по почте, и сказали проверить транзакции самому, если что -- через онлайнбанк подать заявку на опротестовывание их :D
tl;dr: дело Митника живёт, социалка -- топчик.
А в чем отличие между первыми двумя? Подсвечены фичи разные, но у них они одни и те же. O_o
Показывает на качество покрытия тестами. То есть часть эвристик есть, но не покрыто полноценно регрессами... Скорее всего, это практически невозможно, потому и.
И контейнеры позволяют ручную реаллокацию. В отличие от ручного realloc() -- безопасно и аккуартно.
Есть контейнеры, которые уже реализуют варианты кусочно-линейных представлений, есть контейнеры, предоставляющие цельные куски по требованию, есть списки и деревья разных цветов и пород.
Вы правда утверждаете, что ручное выделение, которое написали вы сами, будет работать лучше ручного выделения, которое написал кто-то другой?
Или ваша ручная реализация спокойно поменяет 200 тысяч на 300 миллионов вершин магическим образом, не уходя в никакой лаг?.. Сами же говорите, что нет. Так к чему этот пример был?
Ага. Это ж всегда так работало. "Чтоб неповадно было"
А я б с удовольствием почитал про преобразование одного в другого статью!
Я их видел много кратно. Нет, не просто так. Однако активное использование шаблонов и constexpr -- позволяют оплатить их во время компиляции. unique_ptr делает кучу проверок... Которых не остаётся в скомпилированом коде. Вот простейший синтетический пример: https://godbolt.org/z/ePE68Pob3
Вы вообще знаете, что контейнеры прекрасно работают с аллокаторами? https://en.cppreference.com/w/cpp/container/vector/vector
"Свой аллокатор" это очень полезная штука, не только в геймдеве. Причем код, работающий на контейнерах, прекрасно можно переиспользовать в одном приложении сразу используя с разными аллокаторами без ручного управления.
Да, вам стоит почитать исходники и посмотреть на результат компиляции. Это действительно поучительно.
Действительно есть места, где стандартные контейнеры не подходят, но ответ почему не подходят должен быть осмысленен, оценен и подтвержден -- а не просто проекция страхов на уровне "кто-то там когда-то во времена атлона напел".
А можно не "на глаз" а с примером? Повторюсь: оплата идёт в момент компиляции при аккуратном применении. Тот же unique_ptr буквально компилируется в один указатель, никакой разницы с сырым указателем нет от слова совсем. std::array<X> ничем не отличается от X[], кроме дополнительной безопасности и контроля во время компиляции. Какие именно контейнеры уступают чему именно, можно примеры? А то попахивает что перемножаем яблоки на апельсины и жалуемся что на выходе лампальсины.
А если говорить про "чудесный геймдев"... Я вот вижу насколько блюпринты медленнее си -- и ведь не сказать что все бросили все блюпы нафиг и обходят их за километр, да?