[commit-keeper sha=00b12cd] Некорректная передача указателя в GORM Create #5

Closed
opened 2026-04-27 09:18:06 +00:00 by commit-keeper · 2 comments

Severity: major
Commit: 00b12cd — upd store
Затронутые места:

  • service/version.go строки 40–41

В чём проблема

В методе CreateDocument передается указатель на локальную переменную doc в метод CreateDocument хранилища. Однако, в store/gorm.go реализация CreateDocument принимает *models.Document и вызывает s.db.Create(&doc). Поскольку doc уже является указателем, передача &doc в GORM приводит к созданию записи с некорректными данными или ошибкой, так как GORM ожидает объект или указатель на объект, а не указатель на указатель.

Цитата кода

if err := s.storage.CreateDocument(&doc); err != nil {
		return nil, err
	}

Как исправить

Вариант 1 — Исправить вызов в store/gorm.go, чтобы передавать объект напрямую, так как он уже является указателем.

GORM Create метод принимает interface{}, но для работы с моделями обычно передается либо сам объект, либо указатель на него. Передача &doc (где doc это *models.Document) создает **models.Document, что некорректно.

func (s *GormStorage) CreateDocument(doc *models.Document) error {
	return s.db.Create(doc).Error
}

Автоматическая проверка commit-keeper · модель gemma4:31b · sha=00b12cd

**Severity:** major **Commit:** [`00b12cd`](https://git.gm6.ru/icewind/seadoc/commit/00b12cdf7dbee7b9d54a1075acfdc0666ff6aa30) — upd store **Затронутые места:** - `service/version.go` строки 40–41 ## В чём проблема В методе `CreateDocument` передается указатель на локальную переменную `doc` в метод `CreateDocument` хранилища. Однако, в `store/gorm.go` реализация `CreateDocument` принимает `*models.Document` и вызывает `s.db.Create(&doc)`. Поскольку `doc` уже является указателем, передача `&doc` в GORM приводит к созданию записи с некорректными данными или ошибкой, так как GORM ожидает объект или указатель на объект, а не указатель на указатель. ## Цитата кода ``` if err := s.storage.CreateDocument(&doc); err != nil { return nil, err } ``` ## Как исправить ### Вариант 1 — Исправить вызов в `store/gorm.go`, чтобы передавать объект напрямую, так как он уже является указателем. GORM `Create` метод принимает `interface{}`, но для работы с моделями обычно передается либо сам объект, либо указатель на него. Передача `&doc` (где `doc` это `*models.Document`) создает `**models.Document`, что некорректно. ``` func (s *GormStorage) CreateDocument(doc *models.Document) error { return s.db.Create(doc).Error } ``` --- <sub><sup>Автоматическая проверка commit-keeper · модель `gemma4:31b` · `sha=00b12cd`</sup></sub> <!-- commit-keeper -->
Owner

Починил коммитом 3e05ab6 — убрал лишний амперсанд. Проверь, пожалуйста.

Починил коммитом 3e05ab6 — убрал лишний амперсанд. Проверь, пожалуйста.
Author

Подтверждаю — проблема устранена коммитом 3e05ab6

Уверенность: high

В файле store/gorm.go была исправлена ошибка передачи указателя на указатель в метод Create библиотеки GORM. Ранее вызывался Create(&doc), где doc уже был типа *models.Document, что приводило к передаче **models.Document. В фиксе изменен вызов на Create(doc), что соответствует ожиданиям GORM и полностью устраняет проблему, описанную в issue.

## Подтверждаю — проблема устранена коммитом `3e05ab6` **Уверенность:** high В файле `store/gorm.go` была исправлена ошибка передачи указателя на указатель в метод `Create` библиотеки GORM. Ранее вызывался `Create(&doc)`, где `doc` уже был типа `*models.Document`, что приводило к передаче `**models.Document`. В фиксе изменен вызов на `Create(doc)`, что соответствует ожиданиям GORM и полностью устраняет проблему, описанную в issue. <!-- commit-keeper -->
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: icewind/seadoc#5
No description provided.