{"record":{"id":"1c5fa4e1822a61d3","repo":"go-gorm/gorm","slug":"integer-overflow-conversion-uint64-d-int64","errorCode":null,"errorMessage":"integer overflow conversion uint64(%d) -> int64","messagePattern":"integer overflow conversion uint64\\((.+?)\\) -> int64","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"schema/serializer.go","lineNumber":136,"sourceCode":"// Scan implements serializer interface\nfunc (UnixSecondSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value, dbValue interface{}) (err error) {\n\tt := sql.NullTime{}\n\tif err = t.Scan(dbValue); err == nil && t.Valid {\n\t\terr = field.Set(ctx, dst, t.Time.Unix())\n\t}\n\n\treturn\n}\n\n// Value implements serializer interface\nfunc (UnixSecondSerializer) Value(ctx context.Context, field *Field, dst reflect.Value, fieldValue interface{}) (result interface{}, err error) {\n\trv := reflect.ValueOf(fieldValue)\n\tswitch fieldValue.(type) {\n\tcase int, int8, int16, int32, int64:\n\t\tresult = time.Unix(rv.Int(), 0).UTC()\n\tcase uint, uint8, uint16, uint32, uint64:\n\t\tif uv := rv.Uint(); uv > math.MaxInt64 {\n\t\t\terr = fmt.Errorf(\"integer overflow conversion uint64(%d) -> int64\", uv)\n\t\t} else {\n\t\t\tresult = time.Unix(int64(uv), 0).UTC() //nolint:gosec\n\t\t}\n\tcase *int, *int8, *int16, *int32, *int64:\n\t\tif rv.IsZero() {\n\t\t\treturn nil, nil\n\t\t}\n\t\tresult = time.Unix(rv.Elem().Int(), 0).UTC()\n\tcase *uint, *uint8, *uint16, *uint32, *uint64:\n\t\tif rv.IsZero() {\n\t\t\treturn nil, nil\n\t\t}\n\t\tif uv := rv.Elem().Uint(); uv > math.MaxInt64 {\n\t\t\terr = fmt.Errorf(\"integer overflow conversion uint64(%d) -> int64\", uv)\n\t\t} else {\n\t\t\tresult = time.Unix(int64(uv), 0).UTC() //nolint:gosec\n\t\t}\n\tdefault:","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/go-gorm/gorm/blob/1d6ce99528060be18a42be09aca8d39efcb47f28/schema/serializer.go#L118-L154","documentation":"UnixSecondSerializer.Value converts a stored Unix-seconds integer to time.Time when writing to the database. For unsigned inputs, values above math.MaxInt64 cannot be converted to the int64 that time.Unix requires, so the write is rejected with an overflow error instead of silently producing a wrong timestamp.","triggerScenarios":"A model field tagged `gorm:\"serializer:unixsecond;type:bigint\"` (or plain uint64) holding a value > 9223372036854775807 — typically corrupted data, overflowed counters, or uninitialized ^uint64(0)-style defaults.","commonSituations":"Porting legacy data with sentinel values like ^uint64(0); arithmetic overflow before assignment; unit tests filling fields with MaxUint64 to simulate 'far future'.","solutions":["Clamp or validate uint64 values to <= math.MaxInt64 before save.","Investigate where the oversized value comes from — usually a bug or corrupted source data.","If genuinely larger ranges are needed, store nanoseconds in a different representation (string/decimal) rather than Unix seconds."],"exampleFix":"// before\nmaxVal := uint64(math.MaxUint64)\nuser.LoginAt = maxVal // serializer overflows\n\n// after\nif user.LoginAt > math.MaxInt64 {\n    user.LoginAt = math.MaxInt64\n}","handlingStrategy":"validation","validationCode":"func safeUnixSeconds(u uint64) (int64, error) {\n    if u > math.MaxInt64 {\n        return 0, fmt.Errorf(\"unix seconds %d exceeds int64\", u)\n    }\n    return int64(u), nil\n}\n// call before assigning to the serialized field","typeGuard":null,"tryCatchPattern":"if err := db.Create(&user).Error; err != nil {\n    if strings.Contains(err.Error(), \"integer overflow conversion uint64\") {\n        return fmt.Errorf(\"timestamp field overflowed; clamp to MaxInt64 or fix source data: %w\", err)\n    }\n    return err\n}","preventionTips":["Clamp uint64 timestamps to math.MaxInt64 at ingress boundaries.","Never use MaxUint64 sentinels for 'unset' — use 0 or nullable pointers.","Add range validation on deserialized legacy data."],"tags":["gorm","serializer","unixsecond","overflow"],"backgroundTag":null,"analyzedSha":"1d6ce99528060be18a42be09aca8d39efcb47f28","analyzedAt":"2026-08-15T13:01:23.433Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}