LINUX.ORG.RU

reinterpret_cast UB или нет?

 


1

5

Это UB? Есть ли возмодность сделать аналогичное без UB? Если это UB то по каким причинам?

template<typename K, typename V>
struct CPair {
  K key;
  V value;
};
int main()
{
  std::map<int, std::string> sp {{42, "test"}};
  CPair<int, std::string> *p =
  reinterpret_cast<CPair<int, std::string>*> (&(*sp.find(42)));
  std::cout << p->key << " " << p-> value;
}

★★★★★

Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

Добавление невиртуальных методов ничего в бинарном представлении не меняет. Надо почитать стандарт, в частности, ссылки, предоставленные анонимусом, страдающим дислексией и нехваткой времени. Быстрый просмотр меня убедил, скорее, в моей правоте. Надо более вдумчиво почитать.

roof ★★
()
Ответ на: комментарий от anonymous

Получить значение по ключу из мапы можно и более простыми способами. node_handle это для перемещения нод между контейнерами.

roof ★★
()
Ответ на: комментарий от deep-purple

Какие спеки с какой архитектурой ты собрался смешивать?

anonymous
()
Ответ на: комментарий от roof

Получить значение по ключу из мапы можно и более простыми способами.

Автору нужен доступ к ключу на запись, как я понял. И без UB.

anonymous
()
Ответ на: комментарий от roof

Быстрый просмотр меня убедил, скорее, в моей правоте.

«C++ has no accesses of class type» тебя убедило, что ты прав, утверждая, что проблема в том, что «у него доступ к pair через lvalue типа CPair.»???

anonymous
()
Ответ на: комментарий от rumgot

и нет задачи, где без этого нельзя было бы обойтись.

Я бы не был бы столь категоричен=)

А если уже так надо, то можно добавить конструктор

Конструктор - это дополнительный код, как по инструкциям, так и по памяти.

Но я бы так не делал в случае из оп поста, std::pair - это таки библиотечный класс. насколько я знаю layout данных в нем стандартом не определен, то есть решение в принципе даже не совместимым может оказаться между минонрыми версиями компилятора/библиотеки на одной платформе.

Dudraug ★★★★★
()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от anonymous

Одна цитата, вырванная из контекста, вообще ни в чем меня убедить не может. Для изучения контекста нужно спокойно и вдумчиво читать документы, о чем я и написал.

roof ★★
()
Ответ на: комментарий от anonymous

Если так, то логично. Я вот вообще не понял, чего может быть нужно автору этого кода.

roof ★★
()
Ответ на: комментарий от roof

Одна цитата, вырванная из контекста

Долго пытался но не смог представить контекста который мог бы изменить смысл фразы «C++ has no accesses of class type».

anonymous
()

UB. Обращение (при разыменовании) идёт к объекту, которого нет по тому указателю. Разыменование здесь присутствует, так как p->value это синтаксический сахар для (*p).value.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Разыменование это не доступ.

anonymous
()
Ответ на: комментарий от fsb4000

Появилось у меня время доделать бенчмарк. Начал пилить идеальную версию - нужны тесты: https://pastebin.com/raw/LvRK05uQ - потести, пж. То, что оно пишет на некоторых строки,а не некоторых не пишет - это норма. Оно ещё не доделано и не на всех конфигурациях заполняет дырки правильно. Но производительность выдаёт правильную.

Собирать так же. Если оно у тебя упадёт на

std::strtoul(read_file("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq").c_str(), nullptr, 10) * 1000;

Просто замени это на максимальную частоту твоего процессора.

maalik_briton
()
Ответ на: комментарий от RazrFalcon

UB. Если код не содержит Undefined Behaviour и его исполнение приводит к гарантированному прострелу стопы, но ни сам автор, ни консилиум знатоков не могут этого ни подтвердить, ни опровергнуть, то это Unidentified Bullshit.

t184256 ★★★★★
()
Ответ на: комментарий от maalik_briton
~ g++ -O3 -std=c++17 LvRK05uQ.cpp && ./a.out
(5, 3, 10): 0.327668sec, 6.103744GB/s, 1.638tpc
(1, 3, 10): 0.435120sec, 4.596429GB/s, 1.234tpc
(1, 2, 10): 0.459338sec, 4.354094GB/s, 1.169tpc
(3, 6, 10): 0.780734sec, 2.561693GB/s, 0.688tpc
(3, 5, 20): 0.294056sec, 6.801418GB/s, 1.826tpc
(4, 4, 10): 0.287162sec, 6.964710GB/s, 1.870tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 0.289929sec, 6.898228GB/s, 1.852tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 0.289550sec, 6.907258GB/s, 1.854tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(5, 3, 10): 0.298832sec, 6.692722GB/s, 1.797tpc
(3, 5, 10): 0.966036sec, 2.070312GB/s, 0.556tpc
(1, 8, 10): 0.385803sec, 5.183987GB/s, 1.392tpc
(1, 4, 10): 0.404743sec, 4.941400GB/s, 1.326tpc
(1, 2, 10): 0.457901sec, 4.367756GB/s, 1.172tpc
(1, 2, 10): 0.457947sec, 4.367315GB/s, 1.172tpc
(1, 2, 10): 1.712740sec, 1.167719GB/s, 0.313tpc
~ gcc --version
gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
~ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          8
On-line CPU(s) list:             0-7
Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           142
Model name:                      Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
Stepping:                        10
CPU MHz:                         804.002
CPU max MHz:                     4000.0000
CPU min MHz:                     400.0000
BogoMIPS:                        3984.00
Virtualization:                  VT-x
L1d cache:                       128 KiB
L1i cache:                       128 KiB
L2 cache:                        1 MiB
L3 cache:                        8 MiB
NUMA node0 CPU(s):               0-7
Vulnerability L1tf:              Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
Vulnerability Mds:               Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Meltdown:          Mitigation; PTI
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Full generic retpoline, IBPB conditional, IBRS_FW, STIBP conditional, RSB filling
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe
                                 syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf
                                  tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic
                                 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti s
                                 sbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mp
                                 x rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_wind
                                 ow hwp_epp md_clear flush_l1d
htower_ ★★
()
Ответ на: комментарий от invy

Сишники обожают.

не вводи людей в заблуждение. если под «сишниками» ты имеешь ввиду крестовиков, то так и говори. в сях касты с указателями в порядке вещей.

vvviperrr ★★★★★
()
Ответ на: комментарий от maalik_briton

Запустил. Замены которые сделал:

size_t cpuinfo_max_freq = 2260000000; // std::strtoul(read_file("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq").c_str(), nullptr, 10) * 1000;
/*__always_inline*/inline static void process(const char * in, char * out) {
auto dataset = (char *)mmap(nullptr, n + 4096, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|/*MAP_POPULATE|*/MAP_PRIVATE, 0, 0);

Если собирать как в тестах:

g++-9 -O3 -fomit-frame-pointer -march=native  -std=gnu++2a -lstdc++fs last.cpp -o last

./last
(5, 3, 10): 1.285655sec, 1.555627GB/s, 0.739tpc
(1, 3, 10): 1.392527sec, 1.436237GB/s, 0.682tpc
(1, 2, 10): 1.353350sec, 1.477814GB/s, 0.702tpc
(3, 6, 10): 1.206201sec, 1.658098GB/s, 0.788tpc
(3, 5, 20): 1.243445sec, 1.608432GB/s, 0.764tpc
(4, 4, 10): 1.165896sec, 1.715418GB/s, 0.815tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 1.159045sec, 1.725558GB/s, 0.820tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 1.161732sec, 1.721567GB/s, 0.818tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(5, 3, 10): 1.290603sec, 1.549663GB/s, 0.736tpc
(3, 5, 10): 1.306882sec, 1.530358GB/s, 0.727tpc
(1, 8, 10): 1.231989sec, 1.623391GB/s, 0.771tpc
(1, 4, 10): 1.238509sec, 1.614844GB/s, 0.767tpc
(1, 2, 10): 1.351298sec, 1.480058GB/s, 0.703tpc
(1, 2, 10): 1.348495sec, 1.483134GB/s, 0.705tpc
(1, 2, 10): 4.031501sec, 0.496093GB/s, 0.236tpc

А так если собирать, как мы в прошлый раз собирали:

g++-9 -Ofast -march=native -fwhole-program -funroll-all-loops  -std=gnu++2a -lstdc++fs last.cpp -o last
./last
(5, 3, 10): 1.236477sec, 1.617498GB/s, 0.768tpc
(1, 3, 10): 1.260593sec, 1.586554GB/s, 0.754tpc
(1, 2, 10): 1.177917sec, 1.697912GB/s, 0.807tpc
(3, 6, 10): 1.150058sec, 1.739042GB/s, 0.826tpc
(3, 5, 20): 1.149489sec, 1.739901GB/s, 0.827tpc
(4, 4, 10): 1.119731sec, 1.786143GB/s, 0.849tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 1.117426sec, 1.789827GB/s, 0.850tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(4, 4, 10): 1.124264sec, 1.778941GB/s, 0.845tpc
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC^TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
GCGTGAGCCACCGCGCCCGGCCTTTTTGAGAC_GGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGCGATCTCGGCTCACTGCAACC_TCCGCCTCCCGGGTTCAAGCGATTCTCCTGCCTCAG
(5, 3, 10): 1.240749sec, 1.611929GB/s, 0.766tpc
(3, 5, 10): 1.204658sec, 1.660220GB/s, 0.789tpc
(1, 8, 10): 1.142005sec, 1.751305GB/s, 0.832tpc
(1, 4, 10): 1.107829sec, 1.805332GB/s, 0.858tpc
(1, 2, 10): 1.186179sec, 1.686086GB/s, 0.801tpc
(1, 2, 10): 1.174458sec, 1.702913GB/s, 0.809tpc
(1, 2, 10): 3.060147sec, 0.653563GB/s, 0.311tpc
fsb4000 ★★★★★
()
Ответ на: комментарий от htower_

Спс, а собери, пж, с: -Ofast -march=native -fwhole-program -std=gnu++2a

Странно, конечно, у тебя получается. У меня скайлейк двойки выдаёт. Возможно оно что-то не развернуло где-то. Если флажки не помогут(запусти ещё -S, пж. Посмотрим что оно там нагенерило) - значит интел что-то нашаманил.

maalik_briton
()
Ответ на: комментарий от fsb4000

Спасибо. Ну в общем коре2 в говне до сих пор. Ничего не прояснилось. Да и насрать на него. Откопал нехалем - там всё более-менее нормально. Забью пока на эту кору2 пока она у меня не появиться.

maalik_briton
()

Когда ты пишешь на C++, ты всегда привязан к определенному компилятору и к определенной платформе(максимум к парочке ОС).

А в этом случае - никакого UB нет.

lovesan ★★
()
Ответ на: комментарий от lovesan

Слова не мальчика, но java-макаки.

anonymous
()
Ответ на: комментарий от lovesan

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

arturianec100
()
Ответ на: комментарий от arturianec100

Всю сложную работу делает сам Qt, у которого 100500 костылей для каждой платформы и компилятора. Достаточно посмотреть qglobal.h и qcompilerdetection.h

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Согласен, но надо чётко осознавать, что надо дёргать строго qt-шное (и из std) апи и с особой внимательностью дёргать апи платформы.

arturianec100
()
Ответ на: комментарий от roof

Ну что, вдумчивое чтение и отсутствие дислексии помогло тебе найти доступ через lvalue of class type?

anonymous
()
Ответ на: комментарий от anonymous

Пока не дошли руки. Выходные, семья, отоспаться-погулять. Но обязательно посмотрю. Отсутствием дислексии, кстати, похвастаться не могу, увы :)

roof ★★
()
Ответ на: комментарий от anonymous

На моем уровне понимания стандарта эта фраза без контекста вообще не имеет смысла. Что такое access of class type? Доступ к классу как целому?

roof ★★
()
Ответ на: комментарий от roof

Что такое access of class type? Доступ к классу как целому?

Да.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.