trailofbits.go.iterate-over-empty-map.iterate-over-empty-map

profile photo of trailofbitstrailofbits
Author
unknown
Download Count*

Iteration over a possibly empty map $C. This is likely a bug or redundant code

Run Locally

Run in CI

Defintion

rules:
  - id: iterate-over-empty-map
    message: Iteration over a possibly empty map `$C`. This is likely a bug or
      redundant code
    languages:
      - go
    severity: WARNING
    metadata:
      category: security
      cwe: "CWE-665: Improper Initialization"
      subcategory:
        - audit
      confidence: MEDIUM
      likelihood: LOW
      impact: LOW
      technology:
        - --no-technology--
      description: Probably redundant iteration over an empty map
      references:
        - https://blog.trailofbits.com/2019/11/07/attacking-go-vr-ttps/
      license: AGPL-3.0 license
      vulnerability_class:
        - Other
    patterns:
      - pattern: |
          $C = make(map[$T1] $T2, ...)
          ...
          for $K := range $C { ... }
      - pattern-not: |
          $C = make(map[$T1] $T2, ...)
          ...
          $C[$X] = $V
          ...
          for $K := range $C { ... }
      - pattern-not: |
          $C = make(map[$T1] $T2, ...)
          ...
          $C[$X]++
          ...
          for $K := range $C { ... }
      - pattern-not: |
          $C = make(map[$T1] $T2, ...)
          ...
          $C[$X]--
          ...
          for $K := range $C { ... }
      - pattern-not: |
          $C = make(map[$T1] $T2, ...)
          ...
          $CODEC.Unmarshal($BYTES, &$C)
          ...
          for $K := range $C { ... }

Examples

iterate-over-empty-map.go


package main

import (
	"fmt"
	"github.com/tendermint/tendermint/libs/json"
)

func main() {
	iter1()
	iter1_FP_1()
	iter1_FP_2()
	iter1_FP_3()
	iter1_FP_4()
}

func iter1(){
	// ruleid: iterate-over-empty-map
	m := make(map[string]int)

	fmt.Println("iterating")
	for v := range m {
		fmt.Println("map item: ", v)
	}
}

func iter1_FP_1(){
	// ok: iterate-over-empty-map
	m := make(map[string]int)

	m["v1"] = 8
	m["v2"] = 19

	for v := range m {
		fmt.Println("map item: ", v)
	}
}


func iter1_FP_2(){
	// ok: iterate-over-empty-map
	m := make(map[string]int)

	m["v1"]++

	for v := range m {
		fmt.Println("map item: ", v)
	}
}


func iter1_FP_3(){
	// ok: iterate-over-empty-map
	m := make(map[string]int)

	m["v1"]--

	for v := range m {
		fmt.Println("map item: ", v)
	}
}

func iter1_FP_4(){
	jsonValues := []byte(`{"one": 1, "two": 2, "three": 3}`)

	// ok: iterate-over-empty-map
	m := make(map[string]int)

	json.Unmarshal(jsonValues, &m)

	for v := range m {
		fmt.Println("map item: ", v)
	}
}