{"record":{"id":"e8e1c51c3ef16218","repo":"dotnet/wpf","slug":"sr-baddistance-fixedtextpointer","errorCode":null,"errorMessage":"SR.BadDistance","messagePattern":"SR\\.BadDistance","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedTextPointer.cs","lineNumber":275,"sourceCode":"        /// <summary>\n        /// <see cref=\"ITextPointer.CreatePointer(LogicalDirection)\"/>\n        /// </summary>\n        ITextPointer ITextPointer.CreatePointer(LogicalDirection gravity)\n        {\n            return ((ITextPointer)this).CreatePointer(0, gravity);\n        }\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.CreatePointer(int,LogicalDirection)\"/>\n        /// </summary>\n        ITextPointer ITextPointer.CreatePointer(int distance, LogicalDirection gravity)\n        {\n            ValidationHelper.VerifyDirection(gravity, \"gravity\");\n\n            FlowPosition fp = (FlowPosition)_flowPosition.Clone();\n            if (!fp.Move(distance))\n            {\n                throw new ArgumentException(SR.BadDistance, nameof(distance));\n            }\n\n            return new FixedTextPointer(true, gravity, fp);\n        }\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.Freeze\"/>\n        /// </summary>\n        void ITextPointer.Freeze()\n        {\n            _isFrozen = true;\n        }\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.GetFrozenPointer\"/>\n        /// </summary>\n        ITextPointer ITextPointer.GetFrozenPointer(LogicalDirection logicalDirection)\n        {","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedTextPointer.cs#L257-L293","documentation":"FixedTextPointer.CreatePointer (CreateDynamicPointer) clones the current FlowPosition and moves it by 'distance'. If the move cannot be performed (target outside the document's valid position range), ArgumentException(SR.BadDistance) is thrown.","triggerScenarios":"Calling CreatePointer(gravity, distance) with a distance larger than the remaining positions forward/backward from the current pointer — e.g. moving past the end or before the start of the text container.","commonSituations":"Seeking by a symbol count computed from another document; retrying moves in a loop without checking bounds; distances derived from user input.","solutions":["Clamp distance to the container's valid offset range before creating the pointer.","Use MoveByOffset-style APIs that check return values, or compare pointer positions with CompareTo before moving.","Iterate with smaller moves until Move succeeds, or use the container's end/start pointers as bounds.","Catch ArgumentException and clamp/retry with a smaller distance."],"exampleFix":"// before\nvar p = pointer.CreatePointer(gravity, hugeOffset); // throws if out of range\n// after\nvar p = pointer.CreatePointer(gravity, Math.Min(Math.Max(hugeOffset, minOffset), maxOffset));","handlingStrategy":"validation","validationCode":"int clamped = Math.Max(container.MinOffset, Math.Min(container.MaxOffset, distance));\nvar p = pointer.CreatePointer(gravity, clamped);","typeGuard":null,"tryCatchPattern":"try { p = pointer.CreatePointer(gravity, distance); }\ncatch (ArgumentException) { p = distance > 0 ? container.End : container.Start; }","preventionTips":["Clamp offsets against the container's start/end pointers before moving.","Compare pointer positions (CompareTo) to bound seeks.","Never derive distances from foreign documents' offsets."],"tags":["wpf","documents","argument-exception","text-pointer"],"backgroundTag":"argument-out-of-range","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}