Go escape анализ "leaking param" и "leaking param content" - что происходит с кодом?

Код функции (go):

func (baselog *BaseLogger) OutMessage(content *[]byte) error {
    if baselog.Out != nil {
        baselog.Mu.Lock()
        _, err := baselog.Out.Write(*content)
        baselog.Mu.Unlock()
        return err
    }
    return nil
}

Сообщения GO escape анализа:

./base_logger.go:128:7: leaking param: baselog
./base_logger.go:128:39: leaking param content: content
./base_logger.go:130:18: inlining call to sync.(*Mutex).Lock
./base_logger.go:132:20: inlining call to sync.(*Mutex).Unlock

Последние два - понятны. Не понятно куда и на каком основании "утекает" приемник метода baselog и контент параметра content?

Про инлайнинг функции нет ни слова, т.е. она таки вызывается как положено. Приемник через указатель типа, т.к. есть другие методы, которые модифицируют поля структуры. Тут никакой модификации полей нет, но приемник куда-то "утекает", куда и почему? Контент параметра content, видимо "содержимое указателя", т.е. слайс. Про его перемещение в кучу указаний нет, но тоже "куда-то утекает" .. вопросы те же.

Может кто-то может расшифровать сообщения Эскейп-анализатора в этом коде?

P.S. Изменение параметра на content []byte и передача как слайса в функцию Write(content) не меняет сообщения Эскейп-анализатора.

P.P.S. странно, не могу добавить как ответ при положительной репутации, нашел это:

A "leaking param" means that this function somehow keeps its parameter alive after it returns, this doesn't mean it's being moved to heap, in fact most of "leaking params" are allocated on the stack.

Можно ли отсюда сделать вывод, что параметр, оставаясь на стеке "утекает" из списка параметров и используется копия, размещенная на стеке ранее? Поэтому он и "утекает" - в вызывающий контекст. То есть это есть "хорошо".

P.P.S.2 Дополню: Нет. Если смотреть gcflags='-m -m -m -m' в максимальной деталировке, то видно что leaking param помечено "в кучу". То есть параметры утекают в кучу, но .. ЗАЧЕМ?


Ответы (0 шт):