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

Author
unknown
Download Count*
License
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: CC-BY-NC-SA-4.0
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)
}
}
Short Link: https://sg.run/08jj