CodeQL 文档

可迭代对象可以是字符串或序列

ID: py/iteration-string-and-sequence
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - reliability
   - maintainability
   - non-local
Query suites:
   - python-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

for 语句旨在允许你迭代序列或其他可迭代对象的元素。Python 中的字符串是可迭代的,并且经常以这种方式使用。然而,它们也经常被认为不是字符序列,而是原子实体。

Python 中的一个缺陷来源是错误地迭代非可迭代对象,例如整数。这种缺陷很容易检测到,因为将引发 TypeError。但是,如果字符串被错误地用作 for 语句中的可迭代对象,而该语句也接收其他序列(如列表),则代码将逐个字符迭代字符串。这可能不是程序员的意图,并会导致难以发现的错误。

建议

由于这种缺陷通常表示逻辑错误,因此无法给出解决缺陷的一般方法。但是,添加一个检查迭代器是否不是字符串的保护措施可能是值得的。

示例

在这个示例中,循环可能会迭代 "Hello",每行产生一个字符,以及迭代 [ "Hello", "World" ]。程序员很可能忘记将 "Hello" 括在方括号中。


#Mistakenly mixed list and string
def greeting():
    if is_global():
        greet = [ "Hello", "World" ]
    else:
        greet = "Hello"
    for word in greet:
        print(word)

#Only use list
def fixed_greeting():
    if is_global():
        greet = [ "Hello", "World" ]
    else:
        greet = [ "Hello" ]
    for word in greet:
        print(word)

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私