Class: FiberAudit::Static::Rules::BlockingSubprocess

Inherits:
Base
  • Object
show all
Defined in:
lib/fiber_audit/static/rules/blocking_subprocess.rb

Overview

FA1001: Subprocess lifecycle operations that may interfere with the fiber scheduler. Detects subprocess creation, replacement, waiting, detachment, and stream lifecycle operations.

Operations are classified into semantic categories:

  • creation: spawning a new process (info)
  • replacement: replacing the current process via exec (info)
  • waiting: blocking waits for subprocess completion (medium)
  • detach: detaching a subprocess without waiting (info)
  • stream: subprocess pipe/stream lifecycle via IO.popen (medium)

Severity: info for creation/replacement/detach, medium for waits/stream. These are scheduler-cooperation requirements, so execution context does not by itself escalate them to critical.

Constant Summary collapse

TARGETS =
OperationVocabulary::FA1001_TARGETS
BARE_KERNEL_METHODS =
OperationVocabulary::FA1001_KERNEL_METHODS
OPERATION_CATEGORY =
OperationSemantics::FA1001_CATEGORIES
CATEGORY_METADATA =

Per-category metadata

{
  creation: {
    severity: :info,
    title: 'Subprocess creation',
    message: 'Spawning a subprocess may leave background processes that outlive the fiber scheduler session.',
    remediation: 'Track spawned processes or move subprocess creation outside the fiber-scheduled path.'
  },
  replacement: {
    severity: :info,
    title: 'Process replacement',
    message: 'Process replacement via exec replaces the current process image, terminating the fiber scheduler.',
    remediation: 'Avoid exec in fiber-scheduled code; prefer subprocess creation with explicit lifecycle management.'
  },
  waiting: {
    severity: :medium,
    title: 'Subprocess wait',
    message: 'Subprocess waiting requires scheduler process-wait cooperation in a non-blocking Fiber.',
    remediation: 'Verify scheduler process_wait support and runtime progress, ' \
                 'or move waits outside the fiber-scheduled path.'
  },
  detach: {
    severity: :info,
    title: 'Subprocess detach',
    message: 'Detaching a subprocess may leave it unmanaged by the fiber scheduler.',
    remediation: 'Avoid detaching subprocesses in fiber-scheduled code; use explicit lifecycle management.'
  },
  stream: {
    severity: :medium,
    title: 'Subprocess pipe stream',
    message: 'Subprocess pipe I/O requires scheduler cooperation while the stream is open.',
    remediation: 'Verify scheduler-aware I/O and runtime progress on the pipe, ' \
                 'or move pipe operations outside the fiber-scheduled path.'
  }
}.freeze

Constants inherited from Base

FiberAudit::Static::Rules::Base::CONTEXT_CEILING

Instance Method Summary collapse

Methods inherited from Base

confidence, default_confidence, default_severity, description, id, #initialize, severity

Constructor Details

This class inherits a constructor from FiberAudit::Static::Rules::Base

Instance Method Details

#analyze(call_sites:) ⇒ Object



74
75
76
77
78
79
80
# File 'lib/fiber_audit/static/rules/blocking_subprocess.rb', line 74

def analyze(call_sites:)
  call_sites.filter_map do |site|
    next unless (match = match_call_site(site))

    build_finding(site, match)
  end
end