Skip to content

Commit

Permalink
Flag various collections as dangerous defaults (pylint-dev#3183) (pyl…
Browse files Browse the repository at this point in the history
  • Loading branch information
scop authored and PCManticore committed Oct 16, 2019
1 parent 141873a commit 6df0b3e
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 4 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Expand Up @@ -22,6 +22,10 @@ Release date: TBA

Close #3190

* Flag mutable ``collections.*`` utilities as dangerous defaults

Close #3183


What's New in Pylint 2.4.3?
===========================
Expand Down
2 changes: 2 additions & 0 deletions doc/whatsnew/2.5.rst
Expand Up @@ -30,3 +30,5 @@ Other Changes
A pyproject.toml file must prepend section names with ``tool.pylint.``,
for example ``[tool.pylint.'MESSAGES CONTROL']``.
These files can also be passed in on the command line.

* Mutable ``collections.*`` are now flagged as dangerous defaults.
16 changes: 14 additions & 2 deletions pylint/checkers/base.py
Expand Up @@ -159,13 +159,25 @@ def get_regex(cls, name_type):
# Name categories that are always consistent with all naming conventions.
EXEMPT_NAME_CATEGORIES = {"exempt", "ignore"}

# A mapping from builtin-qname -> symbol, to be used when generating messages
# A mapping from qname -> symbol, to be used when generating messages
# about dangerous default values as arguments
DEFAULT_ARGUMENT_SYMBOLS = dict(
zip(
[".".join([BUILTINS, x]) for x in ("set", "dict", "list")],
["set()", "{}", "[]"],
)
),
**{
x: "%s()" % x
for x in (
"collections.deque",
"collections.ChainMap",
"collections.Counter",
"collections.OrderedDict",
"collections.defaultdict",
"collections.UserDict",
"collections.UserList",
)
},
)
REVERSED_COMPS = {"<": ">", "<=": ">=", ">": "<", ">=": "<="}
COMPARISON_OPERATORS = frozenset(("==", "!=", "<", ">", "<=", ">="))
Expand Down
30 changes: 29 additions & 1 deletion tests/functional/d/dangerous_default_value_py30.py
@@ -1,5 +1,5 @@
# pylint: disable=missing-docstring

import collections

HEHE = {}

Expand Down Expand Up @@ -77,3 +77,31 @@ def function15(value=INVALID_DICT): # [dangerous-default-value]
def function16(value={1}): # [dangerous-default-value]
"""set literal as default value"""
return value

def function17(value=collections.deque()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function18(value=collections.ChainMap()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function19(value=collections.Counter()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function20(value=collections.OrderedDict()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function21(value=collections.defaultdict()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function22(value=collections.UserDict()): # [dangerous-default-value]
"""mutable, dangerous"""
return value

def function23(value=collections.UserList()): # [dangerous-default-value]
"""mutable, dangerous"""
return value
9 changes: 8 additions & 1 deletion tests/functional/d/dangerous_default_value_py30.txt
Expand Up @@ -11,4 +11,11 @@ dangerous-default-value:52:function12:Dangerous default value dict() (builtins.d
dangerous-default-value:61:function13:Dangerous default value OINK (builtins.dict) as argument
dangerous-default-value:65:function14:Dangerous default value dict() (builtins.dict) as argument
dangerous-default-value:73:function15:Dangerous default value INVALID_DICT (builtins.dict) as argument
dangerous-default-value:77:function16:Dangerous default value set() as argument
dangerous-default-value:77:function16:Dangerous default value set() as argument
dangerous-default-value:81:function17:Dangerous default value deque() (collections.deque) as argument
dangerous-default-value:85:function18:Dangerous default value ChainMap() (collections.ChainMap) as argument
dangerous-default-value:89:function19:Dangerous default value Counter() (collections.Counter) as argument
dangerous-default-value:93:function20:Dangerous default value OrderedDict() (collections.OrderedDict) as argument
dangerous-default-value:97:function21:Dangerous default value defaultdict() (collections.defaultdict) as argument
dangerous-default-value:101:function22:Dangerous default value UserDict() (collections.UserDict) as argument
dangerous-default-value:105:function23:Dangerous default value UserList() (collections.UserList) as argument

0 comments on commit 6df0b3e

Please sign in to comment.