{"record":{"id":"a477dbcee2e19c15","repo":"projectdiscovery/katana","slug":"result-is-nil","errorCode":null,"errorMessage":"result is nil","messagePattern":"result is nil","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/output/output.go","lineNumber":180,"sourceCode":"\t\tif err != nil {\n\t\t\treturn nil, errkit.Wrap(err, \"output: could not create error file\")\n\t\t}\n\n\t\twriter.errorFile = errorFile\n\t}\n\tif options.OutputTemplate != \"\" {\n\t\twriter.outputTemplate, err = fasttemplate.NewTemplate(options.OutputTemplate, \"{{\", \"}}\")\n\t\tif err != nil {\n\t\t\treturn nil, errkit.Wrap(err, \"output: could not create output format template\")\n\t\t}\n\t}\n\treturn writer, nil\n}\n\n// Write writes the result to file and/or screen.\nfunc (w *StandardWriter) Write(result *Result) error {\n\tif result == nil {\n\t\treturn errors.New(\"result is nil\")\n\t}\n\n\t// Skip empty responses (e.g., from similarity filtering)\n\tif result.Response != nil && result.Response.Resp == nil && result.Response.Body == \"\" && result.Error == \"\" {\n\t\treturn errors.New(\"response filtered by similarity detection\")\n\t}\n\n\tif len(w.storeFields) > 0 {\n\t\tstoreFields(result, w.storeFields)\n\t}\n\n\tif !w.extensionValidator.ValidatePath(result.Request.URL) {\n\t\treturn errors.New(\"result does not match extension filter\")\n\t}\n\n\tif !w.matchOutput(result) {\n\t\treturn errors.New(\"result does not match output\")\n\t}","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/projectdiscovery/katana/blob/e3e742739c3746f085943ce918fb4e2b8daf6fe6/pkg/output/output.go#L162-L198","documentation":"StandardWriter.Write rejects a nil *Result immediately with 'result is nil' as an argument-invariant guard. It also returns an error for results whose response was filtered out by similarity detection (empty response, no body, no error). The error protects downstream file/screen formatting from nil dereferences.","triggerScenarios":"Calling Write(nil) directly or wiring a pipeline (the anonymous caller) that forwards a nil result pointer into the standard writer, e.g. from custom engines or output hooks that forget to check for nil.","commonSituations":"Custom result producers yielding nil on error paths; pipelines assembling results concurrently where a nil slips through; misuse of the library as a Go dependency rather than CLI usage.","solutions":["Ensure producers never emit nil results; check for nil before calling writer.Write","Treat the error as a programming bug — filter or log it rather than retrying","If results are intentionally empty (similarity-filtered), skip them upstream instead of writing"],"exampleFix":"// before\nwriter.Write(result) // result may be nil\n// after\nif result != nil {\n    if err := writer.Write(result); err != nil { log.Error(err) }\n}","handlingStrategy":"type-guard","validationCode":"if result == nil {\n    return nil // or skip writing\n}\nif err := writer.Write(result); err != nil { log.Error(err) }","typeGuard":"func writable(r *output.Result) bool { return r != nil && (r.Response == nil || r.Response.Resp != nil || r.Response.Body != \"\" || r.Error != \"\") }","tryCatchPattern":"if err := writer.Write(result); err != nil {\n    if err.Error() == \"result is nil\" {\n        log.Error(\"pipeline produced nil result — fix producer\")\n        return nil\n    }\n    return err\n}","preventionTips":["Check every result for nil before passing to the writer","Ensure concurrent producers cannot emit nil results","Treat similarity-filtered empty responses by skipping them upstream","Log rather than retry — this error indicates a code bug, not a transient failure"],"tags":["output","nil-pointer","api-misuse"],"backgroundTag":"nil-argument","analyzedSha":"e3e742739c3746f085943ce918fb4e2b8daf6fe6","analyzedAt":"2026-09-03T14:55:13.248Z","contentChangedAt":"2026-09-03T14:55:13.248Z","schemaVersion":2},"datasetVersion":"2026-09-10T17:17:09.494Z"}