

Size: a a a





# Human injectionИз сборника Big list of naughty strings — списка строк, которые приведут к проблемам для софта, который небрежно обрабатывает пользовательский ввод, конкретно здесь
#
# Strings which may cause human to reinterpret worldview
If you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.


sortedIDs — в ржавом варианте обход заканчивается, когда набирается достаточно подходящих строк.sortedByDateSpottedIDs будет как минимум countIDsNeedToShow строк — в варианте ниже итоговый вектор просто будет содержать меньше paging.limit строк, если их не хватает (это, кстати, можно считать как плюсом, так и минусом, но надо отметить, что нарушение этого ожидания в оригинальном варианте вызовет панику из-за некорректного индекса, а в моём варианте можно постфактум проверить длину возвращённого вектора).func getIDsForTextSearch(Всё при нём: единственный цикл, один слайс с предварительно выделенной памятью, ранний выход из цикла при достижении нужного количества строк... Что же не так? А вот что: наглядность отсутствует напрочь. Помимо двух возвращаемых значений, есть две технические переменные, которые нужно менять, и три условных оператора, которые нужно расставить в правильном порядке — или получить странные баги. Также тут есть пара мест для того, чтобы сделать ошибку на единицу. Но технически это всё ещё достаточно простой код. Вот только с запашком. Я бы на код-ревью подумал бы, стоит ли такой код пускать в прод.
sortedIDs []string,
spottedIDsWithDocCount map[string]int,
paging paging,
) ([]string, int) {
idsForSearch := make([]string, 0, paging.Limit)
skip := paging.Offset
iterated := 0
total := 0
for _, id := range sortedCallIDs {
if iterated >= paging.Limit {
break
}
count, spotted := spottedIDsWithDocCount[id]
if !spotted {
continue
}
if skip > 0 {
skip--
continue
}
iterated++
idsForSearch = append(idsForSearch, id)
total += count
}
return idsForSearch, total
}
iterated можно выкинуть и проверять длину idsForSearch. Впрочем, моя позиция остаётся прежней











Self:: 😅

char, в Go это rune. Эти типы, казалось бы, одинаковы: оба хранят юникодные символы, оба занимают 32 бита. Тем не менее, в плане диапазона приемлемых значений они заметно отличаются. Чем именно — подробно рассказывается в статье.