golangci/golangci-lint · error

failed to validate analyzers: %w

Error message

failed to validate analyzers: %w

What it means

Wraps a failure from analysis.Validate(lnt.analyzers) (golang.org/x/tools/go/analysis) in golangci-lint's preRun. The analysis framework validates analyzers before running — e.g. duplicate analyzer names, missing Requires, or analyzers whose flagsets conflict. If validation fails, golangci-lint cannot start the analysis pass.

Source

Thrown at pkg/goanalysis/linter.go:185

	for analyzerName, analyzerSettings := range lnt.cfg {
		a := analyzersMap[analyzerName]
		if a == nil {
			return fmt.Errorf("settings key %q must be valid analyzer name, valid analyzers: %v",
				analyzerName, lnt.allAnalyzerNames())
		}

		if err := lnt.configureAnalyzer(a, analyzerSettings); err != nil {
			return fmt.Errorf("failed to configure analyzer %s: %w", analyzerName, err)
		}
	}

	return nil
}

func (lnt *Linter) preRun(lintCtx *linter.Context) error {
	if err := analysis.Validate(lnt.analyzers); err != nil {
		return fmt.Errorf("failed to validate analyzers: %w", err)
	}

	if err := lnt.configure(); err != nil {
		return fmt.Errorf("failed to configure analyzers: %w", err)
	}

	if lnt.contextSetter != nil {
		lnt.contextSetter(lintCtx)
	}

	return nil
}

func (lnt *Linter) getName() string {
	return lnt.name
}

func (lnt *Linter) getLinterNameForDiagnostic(*Diagnostic) string {

View on GitHub (pinned to ed7a235d2d)

Solutions

  1. Check the wrapped validation error for the specific analyzer problem (duplicate name, missing requirement)
  2. Ensure every analyzer in Requires is also included in the analyzer set
  3. Rename custom analyzers so names are unique
  4. Update custom analyzers to satisfy the x/tools/go/analysis Validate contract for your version

Example fix

// before
analyzers := []*analysis.Analyzer{a, a}
// after
analyzers := []*analysis.Analyzer{a}
Defensive patterns

Strategy: validation

Validate before calling

names := map[string]bool{}
for _, a := range analyzers {
    if names[a.Name] {
        return fmt.Errorf("duplicate analyzer %q", a.Name)
    }
    names[a.Name] = true
    for _, req := range a.Requires {
        if !names[req.Name] && !contains(analyzers, req) {
            return fmt.Errorf("analyzer %q requires missing %q", a.Name, req.Name)
        }
    }
}
// then: if err := analysis.Validate(analyzers); err != nil { return err }

Try / catch

if err := runLint(); err != nil {
    if strings.Contains(err.Error(), "failed to validate analyzers") {
        log.Fatalf("analyzer set invalid: %v", err)
    }
}

Prevention

When it happens

Trigger: Registering/using analyzers with duplicate names, analyzers with unsatisfied Requires dependencies, or invalid analyzer flagsets — typically when custom analyzers are loaded via plugins or the analyzer set is assembled programmatically.

Common situations: Developers building custom golangci-lint builds or plugin-based analyzers hit this when two analyzers share a name or a required analyzer is missing from the set; also after upgrading x/tools where validation rules tightened.

Related errors


AI-assisted analysis of golangci/golangci-lint@ed7a235d2d (2026-09-02). Data as JSON: /api/errors/77f0facecf853adc. Report an issue: GitHub.