{"record":{"id":"5dfd9ddda1fff96a","repo":"golangci/golangci-lint","slug":"failed-to-create-linter-q-w","errorCode":null,"errorMessage":"failed to create linter %q: %w","messagePattern":"failed to create linter %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/golinters/forbidigo/forbidigo.go","lineNumber":58,"sourceCode":"\t\t// disable \"//permit\" directives so only \"//nolint\" directives matters within golangci-lint\n\t\tforbidigo.OptionIgnorePermitDirectives(true),\n\t\tforbidigo.OptionAnalyzeTypes(settings.AnalyzeTypes),\n\t}\n\n\t// Convert patterns back to strings because that is what NewLinter accepts.\n\tvar patterns []string\n\tfor _, pattern := range settings.Forbid {\n\t\tbuffer, err := yaml.Marshal(pattern)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tpatterns = append(patterns, string(buffer))\n\t}\n\n\tforbid, err := forbidigo.NewLinter(patterns, options...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create linter %q: %w\", linterName, err)\n\t}\n\n\tfor _, file := range pass.Files {\n\t\trunConfig := forbidigo.RunConfig{\n\t\t\tFset:     pass.Fset,\n\t\t\tDebugLog: logutils.Debug(logutils.DebugKeyForbidigo),\n\t\t}\n\n\t\tif settings.AnalyzeTypes {\n\t\t\trunConfig.TypesInfo = pass.TypesInfo\n\t\t}\n\n\t\thints, err := forbid.RunWithConfig(runConfig, file)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"forbidigo linter failed on file %q: %w\", file.Name.String(), err)\n\t\t}\n\n\t\tfor _, hint := range hints {","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/golangci/golangci-lint/blob/ed7a235d2d771152056fdc142a9855567c5796a9/pkg/golinters/forbidigo/forbidigo.go#L40-L76","documentation":"runForbidigo builds forbidigo patterns from the config and calls forbidigo.NewLinter; any failure constructing the linter is wrapped as 'failed to create linter %q'. This means one or more configured patterns/options are invalid for the forbidigo library.","triggerScenarios":"A forbidigo pattern in settings.forbidigo.forbid is not a valid regular expression (or a valid struct pattern like 'fmt.Print*:*# comment' when analyze-types/pattern syntax is on), or invalid options (e.g. bad msg/config keys) are passed to forbidigo.NewLinter.","commonSituations":"Hand-written patterns with unbalanced regex groups like 'fmt\\.Print(', patterns copied from docs for a different forbidigo version (struct pattern syntax introduced in forbidigo v1.5/v2), or comments embedded in patterns with an older forbidigo that doesn't support them.","solutions":["Validate each forbidigo pattern as a regex (go run with regexp.Compile or an online tester) and fix syntax errors","Upgrade golangci-lint/forbidigo if you use struct patterns or inline '# comment' syntax unsupported by the bundled version","Reduce the pattern list to isolate the offending entry, then fix it","Escape special regex characters in the identifiers you intend to forbid"],"exampleFix":"# before\nforbidigo:\n  forbid:\n    - 'fmt\\.Print('\n# after\nforbidigo:\n  forbid:\n    - '^fmt\\.Print.*$'","handlingStrategy":"validation","validationCode":"import \"regexp\"\nfor _, p := range cfg.Forbidigo.Forbid {\n    pat := p\n    if i := strings.Index(pat, \"# \"); i >= 0 { // struct-pattern comment\n        pat = pat[:i]\n    }\n    if _, err := regexp.Compile(strings.TrimSuffix(pat, \":*\")); err != nil {\n        return fmt.Errorf(\"invalid forbidigo pattern %q: %w\", p, err)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := golangci.Run(); err != nil {\n    if strings.Contains(err.Error(), \"failed to create linter\") {\n        fmt.Fprintln(os.Stderr, \"fix linters-settings.forbidigo.forbid regex patterns\")\n        os.Exit(1)\n    }\n    return err\n}","preventionTips":["Pre-compile every forbidigo pattern with regexp.Compile in a config test","Escape regex metacharacters in identifiers you forbid","Keep forbidigo pattern syntax in sync with the version bundled in your golangci-lint"],"tags":["golangci-lint","forbidigo","regex","configuration"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"ed7a235d2d771152056fdc142a9855567c5796a9","analyzedAt":"2026-09-02T18:47:33.865Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}