rules:
- id: exported_loop_pointer
  message: >-
    `$VALUE` is a loop pointer that may be exported from the loop. This pointer is
    shared between loop iterations, so the exported reference will always point to
    the last loop value, which is likely unintentional. To fix, copy the pointer to
    a new pointer within the loop.
  metadata:
    references:
    - https://github.com/kyoh86/looppointer
    category: correctness
    technology:
    - go
  severity: WARNING
  languages:
  - go
  pattern-either:
  - pattern: |
      for _, $VALUE := range $SOURCE {
        <... &($VALUE) ...>
      }
  - pattern: |
      for _, $VALUE := range $SOURCE {
        <... func() { <... &$VALUE ...> } ...>
      }
  - pattern: |
      for _, $VALUE := range $SOURCE {
        <... $ANYTHING(..., <... $VALUE ...>, ...) ...>
      }
