diff --git a/python/smells/list-modify-iterating.py b/python/smells/list-modify-iterating.py new file mode 100644 index 0000000000..28ccd48d46 --- /dev/null +++ b/python/smells/list-modify-iterating.py @@ -0,0 +1,19 @@ +l = list(range(100)) +for i in l: + print(i), + # ruleid:list-pop-while-iterate + print(l.pop(0)) + # ruleid:list-pop-while-iterate + x = l.pop(0) + print(x) + +a = [1, 2, 3, 4] +for i in a: + print(i) + # ruleid:list-pop-while-iterate + a.pop(0) + +for i in a: + print(i) + # ruleid:list-pop-while-iterate + a.append(0) \ No newline at end of file diff --git a/python/smells/list-modify-iterating.yaml b/python/smells/list-modify-iterating.yaml new file mode 100644 index 0000000000..6e8bd390d6 --- /dev/null +++ b/python/smells/list-modify-iterating.yaml @@ -0,0 +1,55 @@ +rules: + - id: list-pop-while-iterate + patterns: + - pattern-either: + - pattern: | + for $ELEMENT in $LIST: + ... + $LIST.pop(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $LIST.push(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $LIST.append(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $LIST.extend(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $X = $LIST.pop(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $X = $LIST.push(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $X = $LIST.append(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $X = $LIST.extend(...) + - pattern: | + for $ELEMENT in $LIST: + ... + $X($LIST.pop(...)) + - pattern: | + for $ELEMENT in $LIST: + ... + $X($LIST.push(...)) + - pattern: | + for $ELEMENT in $LIST: + ... + $X($LIST.append(...)) + - pattern: | + for $ELEMENT in $LIST: + ... + $X($LIST.extend(...)) + message: "It appears that `$LIST` is a list that is being modified while in a for loop. This is usually a bad idea" + languages: [python] + severity: WARNING