shadow1ng/fscan · error

result cannot be nil

Error message

result cannot be nil

What it means

Argument guard in TXTWriter.Write: the caller passed a nil *ScanResult. Nothing can be formatted or added to the result buffer/realtime backup, so the write is rejected; it is an API-contract violation, not a filesystem or state problem.

Source

Thrown at common/output/writers.go:127

		realtimePath: realtimePath,
	}, nil
}

// WriteHeader 写入头部
func (w *TXTWriter) WriteHeader() error {
	return nil
}

// Write 收集扫描结果到分类缓冲,同时实时备份
func (w *TXTWriter) Write(result *ScanResult) error {
	w.mu.Lock()
	defer w.mu.Unlock()

	if w.closed {
		return fmt.Errorf("writer is closed")
	}
	if result == nil {
		return fmt.Errorf("result cannot be nil")
	}

	// 1. 加入内存分类缓冲(用于最终有序输出)
	w.buffer.Add(result)

	// 2. 实时写入备份文件(防崩溃丢数据)
	if w.realtimeFile != nil {
		line := w.formatLine(result)
		if _, err := w.realtimeFile.WriteString(line + "\n"); err != nil {
			return fmt.Errorf("failed to write realtime backup: %w", err)
		}
		if err := w.realtimeFile.Sync(); err != nil {
			return fmt.Errorf("failed to sync realtime backup: %w", err)
		}
	}

	return nil
}

View on GitHub (pinned to 95cc12e753)

Solutions

  1. Nil-check results before calling Write
  2. Fix upstream functions to return an error whenever the result is nil
  3. Filter nil entries from result slices before writing

Example fix

// before
for _, r := range results { w.Write(r) } // r may be nil
// after
for _, r := range results {
    if r != nil { w.Write(r) }
}
Defensive patterns

Strategy: type-guard

Validate before calling

if res == nil {
    return errors.New("cannot write nil result")
}
return w.Write(res)

Type guard

func writable(r *ScanResult) bool { return r != nil }

Try / catch

if err := w.Write(res); err != nil {
    if strings.Contains(err.Error(), "result cannot be nil") {
        log.Debug("nil result skipped")
        return nil
    }
    return err
}

Prevention

When it happens

Trigger: Passing nil directly to Write, forwarding (nil, nil) from an upstream scan function, or iterating a results slice containing nil entries.

Common situations: Aggregation code appending nil placeholders, failed probe stages returning no result and no error, tests like TestTXTWriter_NilResult.

Related errors


AI-assisted analysis of shadow1ng/fscan@95cc12e753 (2026-09-06). Data as JSON: /api/errors/9bc9e6497871583f. Report an issue: GitHub.