go-delve/delve · error
invalid Filter pattern: %v
Error message
invalid Filter pattern: %v
What it means
ListPackagesBuildInfo throws this when the optional Filter field is not a valid Go regular expression. The handler compiles in.Filter with regexp.Compile before filtering packages, and compilation failure is reported with the underlying regexp error.
Source
Thrown at service/rpc2/server.go:966
Filter string // if not empty, returns only packages matching the regexp.
}
// ListPackagesBuildInfoOut holds the return values of ListPackagesBuildInfo.
type ListPackagesBuildInfoOut struct {
List []api.PackageBuildInfo
}
// ListPackagesBuildInfo returns the list of packages used by the program along with
// the directory where each package was compiled and optionally the list of
// files constituting the package.
// Note that the directory path is a best guess and may be wrong is a tool
// other than cmd/go is used to perform the build.
func (s *RPCServer) ListPackagesBuildInfo(in ListPackagesBuildInfoIn, out *ListPackagesBuildInfoOut) error {
var pattern *regexp.Regexp
if in.Filter != "" {
p, err := regexp.Compile(in.Filter)
if err != nil {
return fmt.Errorf("invalid Filter pattern: %v", err)
}
pattern = p
}
pkgs := s.debugger.ListPackagesBuildInfo(in.IncludeFiles)
out.List = make([]api.PackageBuildInfo, 0, len(pkgs))
for _, pkg := range pkgs {
if pattern != nil && !pattern.MatchString(pkg.ImportPath) {
continue
}
var files []string
if len(pkg.Files) > 0 {
files = make([]string, 0, len(pkg.Files))
for file := range pkg.Files {
files = append(files, file)
}
}
View on GitHub (pinned to a23773e6c3)
Solutions
- Validate the pattern with regexp.Compile before sending it over RPC and surface the error locally
- Convert glob patterns to regexp syntax: '*' -> '.*', escape '.' as '\\.'
- Escape user-supplied substrings with regexp.QuoteMeta when the intent is literal matching
- Remember Go uses RE2: remove PCRE-only constructs like backreferences or lookaheads
Example fix
// before
_, err := client.ListPackagesBuildInfo(rpc2.ListPackagesBuildInfoIn{Filter: "pkg/(net|http"}) // unbalanced paren
// after
if _, cerr := regexp.Compile("pkg/(net|http)"); cerr != nil {
return cerr // fail fast client-side
}
_, err := client.ListPackagesBuildInfo(rpc2.ListPackagesBuildInfoIn{Filter: "pkg/(net|http)"}) Defensive patterns
Strategy: validation
Validate before calling
func validFilter(f string) error {
if f == "" { return nil }
_, err := regexp.Compile(f)
return err
}
// call: if err := validFilter(in.Filter); err != nil { return err } Try / catch
_, err := client.ListPackagesBuildInfo(rpc2.ListPackagesBuildInfoIn{Filter: pattern})
if err != nil && strings.Contains(err.Error(), "invalid Filter pattern") {
return fmt.Errorf("bad --filter regexp: %w", err)
} Prevention
- Compile the filter client-side first to fail fast with a local error message
- Use regexp.QuoteMeta for literal user input
- Convert globs to RE2 syntax manually ('*' -> '.*')
- Avoid PCRE-only features (backreferences, lookarounds) — Go regexp is RE2
When it happens
Trigger: Calling RPCClient.ListPackagesBuildInfo with ListPackagesBuildInfoIn.Filter set to a syntactically invalid regexp, e.g. unbalanced parentheses '(' , a dangling '*' as the first character, or a bad escape like '\q'.
Common situations: Users typing glob-style filters ('pkg/*' instead of 'pkg/.*') into tooling that passes them straight through as regexps; programmatically-built filters where user input is interpolated unescaped; patterns copied from grep/sed with syntax Go's RE2 rejects (e.g. backreferences).
Related errors
- mismatched length in addrs and addrpid
- can not call function with nil ReturnInfoLoadConfig
- channel filter can not be negated
- count == 0 not allowed with a channel filter
- channel filter without eval scope
AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31).
Data as JSON: /api/errors/c61a0580c6fdb6bf.
Report an issue: GitHub.