shadow1ng/fscan · error

result cannot be nil

Error message

result cannot be nil

What it means

Argument guard in Manager.SaveResult: the method was invoked with a nil *ScanResult, which cannot be serialized to any output writer. It is a programmer/API-contract error (caller passed nil), distinct from the 'output manager is closed' state check that precedes it.

Source

Thrown at common/output/manager.go:81

	if err != nil {
		return err
	}

	m.writer = writer
	return m.writer.WriteHeader()
}

// SaveResult 保存扫描结果
func (m *Manager) SaveResult(result *ScanResult) error {
	m.mu.RLock()
	defer m.mu.RUnlock()

	if m.closed {
		return fmt.Errorf("output manager is closed")
	}

	if result == nil {
		return fmt.Errorf("result cannot be nil")
	}

	return m.writer.Write(result)
}

// Flush 刷新输出
func (m *Manager) Flush() error {
	m.mu.RLock()
	defer m.mu.RUnlock()

	if m.closed {
		return fmt.Errorf("output manager is closed")
	}

	return m.writer.Flush()
}

// Close 关闭输出管理器

View on GitHub (pinned to 95cc12e753)

Solutions

  1. Check results for nil before calling SaveResult
  2. Ensure scan functions return an error alongside nil results so callers can skip
  3. Filter nil entries out of result slices before persisting

Example fix

// before
mgr.SaveResult(res) // res may be nil
// after
if res != nil {
    mgr.SaveResult(res)
}
Defensive patterns

Strategy: type-guard

Validate before calling

if res == nil {
    return errors.New("no scan result to save")
}
return mgr.SaveResult(res)

Type guard

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

Try / catch

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

Prevention

When it happens

Trigger: Passing nil to SaveResult, e.g. when a scan stage produced no result or an upstream function returned (nil, nil) and the caller forwards it unchecked.

Common situations: Pipeline code where a failed probe returns nil result without an error, appending nil in a results slice and flushing it, tests like TestManager_SaveNilResult.

Related errors


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