разобраться как под капотом map устроен
Цель: обойти встроенное ограниечение рантайма и взять указатель на произвольный элементв в map
чтобы вот такой тест отработал
m := map[int]string{1:»forbidden»}
p := hackmap(&m, 1)
*(*string)(p) = «hacked»
fmt.Println(m) // [1:»hacked»]
хочется написать такую функцию hackmap которая прогуляется по памяти и вернет unsafe.Pointer на value, по ключу «1»
интуитивно кажется что можно просто скопировать структуру hmap из runtime которая верхнеуровнево реализует map и скастовать указатель на m через unsafe.Pointer к *hmap и пробежаться по hmap.oldbucket
но на практике, я никак не могу понять как вытащить данные из довольно не простого представления в бакетах со всеми этими выравниваниями и адресной африфметикой
есть идеи как это можно сделать?
зачем это надо?
Написал же в заглавии, просто головоломка, никакого практического смысла, нужно помощь чтобы разобраться с тем как оно работает
Обсуждают сегодня