- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
uint64_t ObjectLoadListener::getRelocationAddend(uint64_t LLVMRelocationType,
uint8_t *FixupAddress) {
uint64_t Addend = 0;
switch (LLVMRelocationType) {
case IMAGE_REL_AMD64_ABSOLUTE:
Addend = *(uint32_t *)FixupAddress;
break;
case IMAGE_REL_AMD64_ADDR64:
Addend = *(uint64_t *)FixupAddress;
break;
case IMAGE_REL_AMD64_REL32:
Addend = *(uint32_t *)FixupAddress;
break;
default:
llvm_unreachable("Unknown reloc type.");
}
return Addend;
}
sam 12.10.2016 14:39 # +7
kegdan 12.10.2016 14:56 # +8
нет, там сверху в углу написанно
kurwa-nextgen 12.10.2016 15:45 # +9
j123123 12.10.2016 16:03 # +12
2. Upcasting Pointers
inkanus-gray 12.10.2016 16:07 # +9
j123123 12.10.2016 16:19 # +12
inkanus-gray 12.10.2016 16:49 # +9
bormand 12.10.2016 17:57 # +12
inkanus-gray 12.10.2016 19:51 # +8
guestinho 12.10.2016 20:01 # −42
kegdan 13.10.2016 07:24 # +10
- Релиз? Пацаны, я всю жизнь на дебаге собираю, УМСР.
- А Почему юнит тесты падают?
- Пацаны, это не я, я такого вообще не пишу
barop 13.10.2016 15:09 # −42
kipar 13.10.2016 21:06 # +9
У вас говно вместо конпелятора, а входные данные вообще какая-то питушня писала. Возьмите gcc последний, линукс 64 бит, и данные на входе чоткие должны быть, а не питушня.
kurwa-nextgen 12.10.2016 17:14 # +8
> /c-undefined-behaviors/
Ну ладно, я тебя понял.
j123123 12.10.2016 20:34 # +9
bormand 12.10.2016 20:57 # +8
kegdan 13.10.2016 07:30 # +7
bormand 13.10.2016 08:29 # +8
kegdan 13.10.2016 08:30 # +10
guestinho 12.10.2016 21:12 # −43
j123123 13.10.2016 14:51 # +9
getRelocationAddend вызывается тут: https://github.com/dotnet/llilc/blob/97cf48ea9a3cdf4a2582a95683a74b572f4cfe45/lib/Jit/LLILCJit.cpp#L761
FixupAddress получается так:
Если дальше ковырять это говно, можно найти
и
надо еще вот этот класс проанализировать
Что-то мне лень анализировть все это говно, но достаточно очевидно, что этот Offset показывает смешения в байтах в MSIL (он же CIL) байткоде, этот байткод не имеет фиксированного размера инструкций, так что там вполне может быть какая-то параша с выравниванием, не кратным 4 или 8 байтам
j123123 13.10.2016 14:58 # +7
Вот это кстати очень круто, икнлудить какое-то говно в тело функции
bormand 13.10.2016 15:50 # +8
Я и в инициализатор массива инклудил, брат жив.
j123123 13.10.2016 16:01 # +9
CrashTesterAnusov 13.10.2016 16:06 # −62
guestinho 13.10.2016 15:04 # −44
j123123 13.10.2016 15:05 # +7
guestinho 13.10.2016 15:08 # −43
guestinho 13.10.2016 15:06 # −43
gost 16.10.2016 19:27 # 0
guestinho 16.10.2016 19:29 # −15
passiv 16.10.2016 22:29 # −79
3_dar 12.10.2016 18:42 # −43
Soul_re@ver 12.10.2016 18:52 # +9
bormand 12.10.2016 20:59 # +10
guestinho 12.10.2016 21:01 # −41
bormand 12.10.2016 21:01 # +11
"Ну не могут же uint8_t и uint64_t лежать в одном и том же месте!" - подумал конпелятор и выкинул код нахуй.
guestinho 12.10.2016 21:03 # −41
bormand 12.10.2016 21:10 # +10
guestinho 12.10.2016 21:22 # −43
Что за хуйня? Мне показалось, или оно вывело байты в обратном порядке? Ты про это?
bormand 12.10.2016 21:28 # +9
З.Ы. Бля, ща попробую воспроизведение замутить. Что-то все примеры из инета перестали UB триггерить.
На пока почитай: http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html
bormand 12.10.2016 21:41 # +9
kegdan 13.10.2016 07:39 # +10
guestinho 12.10.2016 21:42 # −43
bormand 12.10.2016 21:43 # +9
barop 12.10.2016 21:52 # −42
Логичнее было бы назвать бедолагу "byte*", но боюсь что это слово тогда не было де-факто
Antervis 13.10.2016 09:35 # +9
п.с. в pcap указатель на контекст передается через u_char. Тлен и безысходность
inkanus-gray 12.10.2016 21:30 # +7
Но я подозреваю, что речь не об этом.
guestinho 12.10.2016 21:39 # −42
Всегда думал что старшее слово имеет меньший адрес.
inkanus-gray 12.10.2016 21:43 # +9
Есть ещё процессоры со смешанным порядком (PDP-11, в котором старшее двухбайтовое слово имеет меньший адрес, но внутри каждого двухбайтового слова старший октет имеет больший адрес). А на ARM можно вообще переключать порядок октетов на ходу.
guestinho 12.10.2016 21:52 # −41
- это всё нерабочее?
inkanus-gray 12.10.2016 21:57 # +8
inkanus-gray 12.10.2016 22:00 # +8
guestinho 12.10.2016 22:03 # −42
guestinho 12.10.2016 22:15 # −42
guestinho 12.10.2016 22:17 # −42
Я это и хотел соснуть
guestinho 12.10.2016 22:19 # −43
guestinho 12.10.2016 22:21 # −42
bormand 12.10.2016 22:23 # +7
Сдвигами же.
З.Ы. А, ты не про uint32, а про int32 - никак, переполнение, все дела... Разве что кучу ифов нахерачить, чтобы переполнения не задевать.
guestinho 12.10.2016 22:28 # −41
Где здесь используется представление чисел?
(0b111 >> 1) == 0b11
и мне похуй где располагается старшее слово, а где младшее
kegdan 13.10.2016 08:04 # +8
bormand 13.10.2016 08:30 # +7
Тем, что переполнение в знаковый разряд - UB.
А общее у них только представление положительных чисел до 0 .. 2^(n-1) - 1. Отрицательные - implementation defined.
kegdan 13.10.2016 08:33 # +8
Допустим есть
1010111010 - некий 10битный чисел с первой половиной 10101 и второй 11010
нужно получить
1101010101
Причем тут переполнение? Причем тут знаковый разряд?
bormand 13.10.2016 08:35 # +8
kegdan 13.10.2016 08:38 # +8
bormand 13.10.2016 08:40 # +9
kegdan 13.10.2016 08:43 # +7
bormand 13.10.2016 08:45 # +8
Свободу процессорам и компиляторам!
Например можно реализовать проверку на переполнение, как в шарпике, и убивать прогу нахуй... Или сделать saturated числа. Стандарт не запрещает.
kegdan 13.10.2016 08:52 # +7
bormand 13.10.2016 08:53 # +7
Эмбедщина.
kegdan 13.10.2016 08:55 # +7
Что такое Эмбедщина?
bormand 13.10.2016 08:55 # +8
Программирование для встраиваемых устройств (аля микроконтроллеры).
kegdan 13.10.2016 09:00 # +8
dxd 13.10.2016 09:13 # +9
kegdan 13.10.2016 09:36 # +7
bormand 13.10.2016 08:51 # +10
Где-то здесь был пример адовых оптимизаций циклов, которые прокатывали только с int, но не с size_t.
guestinho 12.10.2016 22:24 # −42
guestinho 13.10.2016 19:13 # −42
хуй его знает как хранятся байты (а может даже биты) в uint32?
Может змейкой или в шахматном порядке?
Может всё-таки это UB и какой-нибудь конпелятор NASA для космической ракеты имеет право этот код выпилить?
huesto 13.10.2016 19:34 # −42
MilosTeodosic 13.10.2016 19:39 # −14
huesto 13.10.2016 19:41 # −42
MilosTeodosic 13.10.2016 19:43 # −15
bagor 13.10.2016 19:44 # −59
kipar 13.10.2016 21:10 # +8
Я может ошибаюсь, но по-моему нифига не UB, обычное implementation defined. А так как эмбедщина под конкретный процессор пишется, то вполне допустимо.
3_16dar 13.10.2016 21:21 # −14
guestinho 13.10.2016 22:15 # −42
http://en.cppreference.com/w/cpp/language/implicit_conversion
> If the destination type is signed, the value does not change if the source integer can be represented in the destination type. Otherwise the result is implementation-defined. (Note that this is different from signed integer arithmetic overflow, which is undefined).
barop 14.10.2016 02:54 # −10
guestinho 12.10.2016 22:02 # −42
bormand 12.10.2016 22:04 # +7
guestinho 12.10.2016 22:09 # −43
barop 12.10.2016 21:51 # −42
Ты не знал про байт ордер?
А чего ты еще не знал?
Soul_re@ver 12.10.2016 21:29 # +8
Но signed/unsigned char* не альясятся со всем.
bormand 12.10.2016 21:32 # +8
З.Ы. Или ты как раз об этом?
Soul_re@ver 12.10.2016 22:21 # +8
guestinho 12.10.2016 22:05 # −42
bormand 12.10.2016 22:05 # +7
guestinho 12.10.2016 22:12 # −42
http://en.cppreference.com/w/cpp/language/reinterpret_cast
> AliasedType is char or unsigned char: this permits examination of the object representation of any object as an array of unsigned char.
Antervis 13.10.2016 09:46 # +7
bormand 13.10.2016 09:47 # +8
3_16dar 13.10.2016 21:28 # −17
не пашет
В чар что-ли конвертить?
dxd 13.10.2016 22:13 # +10
guestinho 12.10.2016 22:07 # −42
guestinho 12.10.2016 22:11 # −42
я тут вопросы задаю
guestinho 12.10.2016 22:14 # −42
Soul_re@ver 12.10.2016 22:17 # +8
inkanus-gray 12.10.2016 22:23 # +9
К сожалению, в сишке уже стало нормой складывать буквы с цифрами, поэтому теперь разделить не получится.
kegdan 13.10.2016 08:09 # +9
barop 14.10.2016 02:53 # −10
CHayT 13.10.2016 08:24 # +10
guestinho 13.10.2016 22:19 # −43
3_dar 12.10.2016 20:00 # −42
inkanus-gray 12.10.2016 20:00 # +7
Antervis 13.10.2016 10:08 # +8
gorthauer87 15.10.2016 12:32 # +1
guest 15.10.2016 14:58 # −10
CHayT 15.10.2016 17:23 # +3
passiv 15.10.2016 17:23 # −71
guest 15.10.2016 17:53 # +23
Фактически, поверх вектора сделан свой аллокатор с индексами вместо сырых указателей. Несложно догадаться, что с таким аллокатором можно написать любые виды багов: и мертвые "ссылки", и порча "кучи", и вообще любая хуйня. Еще оверхед на проверку индекса при доступе к элементам вектора. Зато безопасно, че.
guest 15.10.2016 18:05 # −10
guest 15.10.2016 18:07 # −10
guest 15.10.2016 18:09 # −10
passiv 15.10.2016 18:10 # −74
guest 15.10.2016 18:15 # −10
passiv 15.10.2016 18:41 # −74
bormand 16.10.2016 11:08 # 0
Ну да, если пилить односвязные списки на каждый чих, как в сишечке, то всё будет обмазано unsafe'ами... Но ведь даже в крестах так не делают, а пилят контейнер и юзают его :)
Профит подхода с unsafe в том, что опасные куски легко загрепать, перечитать и обмазать на 146% тестами. А остальной код чё-попало с памятью творить не сможет.
CHayT 16.10.2016 11:32 # +2
В расте статические проверки тоже слишком строгие, чтобы верифицировать интересные программы.
j123123 15.10.2016 18:07 # 0
им бы не помешало стандарт почитать. Делать такую фигню совершенно необязательно.
guest 15.10.2016 19:40 # −10
passiv 15.10.2016 19:46 # −64
guest 15.10.2016 20:23 # −10
passiv 15.10.2016 20:47 # −64
guestinho 15.10.2016 21:20 # −10
chtulhu 16.10.2016 04:42 # 0
мы не читаем стандарт, мы его пишем
passiv 16.10.2016 07:28 # −64
guestinho 15.10.2016 21:22 # −10
guestinho 15.10.2016 21:23 # −10
guestinho 15.10.2016 21:26 # −10
guestinho 15.10.2016 21:26 # −10
guestinho 15.10.2016 21:27 # −10
guestinho 15.10.2016 21:27 # −10
passiv 15.10.2016 23:13 # −64
guestinho 16.10.2016 12:32 # −15