{"record":{"id":"2220195ce8ab0949","repo":"shadow1ng/fscan","slug":"parser-invalid-ip-end-val-222019","errorCode":null,"errorMessage":"parser_invalid_ip_end_val","messagePattern":"parser_invalid_ip_end_val","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/parsers/parsers.go","lineNumber":373,"sourceCode":"\t// 处理简写格式 (如: 192.168.1.1-100)\n\tif len(endIPStr) < 4 || !strings.Contains(endIPStr, \".\") {\n\t\treturn parseIPShortRange(startIPStr, endIPStr)\n\t}\n\n\t// 处理完整格式 (如: 192.168.1.1-192.168.1.100)\n\tendIP := net.ParseIP(endIPStr)\n\tif endIP == nil {\n\t\treturn nil, fmt.Errorf(\"%s\", i18n.Tr(\"parser_invalid_end_ip\", endIPStr))\n\t}\n\n\treturn parseIPFullRange(startIP, endIP)\n}\n\n// parseIPShortRange 解析短格式IP范围\nfunc parseIPShortRange(startIPStr, endSuffix string) ([]string, error) {\n\tendNum, err := strconv.Atoi(endSuffix)\n\tif err != nil || endNum > 255 {\n\t\treturn nil, fmt.Errorf(\"%s\", i18n.Tr(\"parser_invalid_ip_end_val\", endSuffix))\n\t}\n\n\tipParts := strings.Split(startIPStr, \".\")\n\tif len(ipParts) != 4 {\n\t\treturn nil, fmt.Errorf(\"%s\", i18n.Tr(\"parser_invalid_ip_fmt\", startIPStr))\n\t}\n\n\tprefixIP := strings.Join(ipParts[0:3], \".\")\n\tstartNum, err := strconv.Atoi(ipParts[3])\n\tif err != nil || startNum > endNum {\n\t\treturn nil, fmt.Errorf(\"%s\", i18n.Tr(\"parser_invalid_ip_range_val\", startIPStr, endSuffix))\n\t}\n\n\tvar allIP []string\n\tfor i := startNum; i <= endNum; i++ {\n\t\tallIP = append(allIP, fmt.Sprintf(\"%s.%d\", prefixIP, i))\n\t}\n","sourceCodeStart":355,"sourceCodeEnd":391,"githubUrl":"https://github.com/shadow1ng/fscan/blob/95cc12e753bf43de7004e5aef42a9ffba3934303/common/parsers/parsers.go#L355-L391","documentation":"parseIPShortRange parses shorthand IP ranges like '192.168.1.10-50'. The end suffix (the number after '-') must parse as an integer and be <= 255; otherwise this error is returned with the offending suffix in the message. The library throws it to reject malformed or out-of-octet range endings before building the IP list.","triggerScenarios":"Calling parseIPRangeString with a short-form range whose end suffix is non-numeric (e.g. '192.168.1.10-abc') or greater than 255 (e.g. '192.168.1.10-300').","commonSituations":"Hand-edited config files or CLI args where the end octet was mistyped, copy-pasted values containing stray characters, or assuming the end may exceed one octet as in a full range format.","solutions":["Correct the range string so the end suffix is an integer between 0 and 255 (e.g. '192.168.1.10-50').","If the range end needs to span octets (e.g. .200 to .1.10), use the full format 'startIP-endIP' instead of the short form.","Trim whitespace/stray characters from the range input before parsing."],"exampleFix":"// before\nParseIPRangeString(\"192.168.1.10-300\")\n// after\nParseIPRangeString(\"192.168.1.10-255\") // or full format \"192.168.1.10-192.168.2.30\"","handlingStrategy":"validation","validationCode":"func validShortRange(r string) bool {\n    i := strings.IndexByte(r, '-')\n    if i < 0 { return false }\n    end, err := strconv.Atoi(r[i+1:])\n    return err == nil && end >= 0 && end <= 255\n}","typeGuard":null,"tryCatchPattern":"ips, err := parseIPRangeString(rangeStr)\nif err != nil {\n    return fmt.Errorf(\"invalid short IP range %q: %w\", rangeStr, err)\n}","preventionTips":["Validate the end octet is an integer 0-255 before passing short-form ranges","Use the full start-end format when the range spans more than one octet","Trim and sanitize user-supplied range strings"],"tags":["ip-range","parsing","validation"],"backgroundTag":"invalid-argument-format","analyzedSha":"95cc12e753bf43de7004e5aef42a9ffba3934303","analyzedAt":"2026-09-06T17:07:30.094Z","contentChangedAt":"2026-09-06T17:07:30.094Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}