python.lang.correctness.concurrent.uncaught-executor-exceptions

profile photo of semgrepsemgrep
Author
7,892
Download Count*

Values returned by thread pool map must be read in order to raise exceptions. Consider using for _ in $EXECUTOR.map(...): pass.

Run Locally

Run in CI

Defintion

rules:
  - id: uncaught-executor-exceptions
    patterns:
      - pattern-inside: |
          with concurrent.futures.thread.ThreadPoolExecutor(...) as $EXECUTOR:
            ...
      - pattern-not-inside: |
          $VAR = $EXECUTOR.map(...)
          ...
          for ... in $VAR:
            ...
      - pattern-not-inside: |
          $VAR = $EXECUTOR.map(...)
          ...
          [... for ... in $VAR]
      - pattern-not-inside: |
          [... for ... in $EXECUTOR.map(...)]
      - pattern-not-inside: |
          for $IT in $EXECUTOR.map(...):
            ...
      - pattern: $EXECUTOR.map(...)
    message: "Values returned by thread pool map must be read in order to raise
      exceptions. Consider using `for _ in $EXECUTOR.map(...): pass`."
    severity: WARNING
    languages:
      - python
    metadata:
      references:
        - https://superfastpython.com/threadpoolexecutor-exception-handling/
      category: correctness
      technology:
        - python
      license: Commons Clause License Condition v1.0[LGPL-2.1-only]

Examples

concurrent.py


from concurrent.futures.thread import ThreadPoolExecutor

def foo():
    with ThreadPoolExecutor(max_workers=5) as executor:
        # ruleid:uncaught-executor-exceptions
        executor.map(run_with_app_context, tasks)

    with ThreadPoolExecutor(max_workers=5) as executor:
        # ok:uncaught-executor-exceptions
        for _ in executor.map(run_with_app_context, tasks):
            pass

    with ThreadPoolExecutor(max_workers=5) as executor:
        # ok:uncaught-executor-exceptions
        print [x for x in executor.map(run_with_app_context, tasks)]