控制语句后的误导性缩进¶
ID: js/misleading-indentation-after-control-statement
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- correctness
- statistical
- non-attributable
- external/cwe/cwe-483
Query suites:
- javascript-security-and-quality.qls
循环体和 if
语句的“then”和“else”分支可以是使用大括号分隔的块语句,也可以是简单语句。在后一种情况下,必须特别注意正确缩进语句以指示它们是否属于循环体或 if
语句。特别地,循环或 if
语句后的直接语句不应与主体缩进相同,以避免对控制流结构的误解。
建议¶
使用额外的缩进将循环体和 then/else 分支区分开来,但对在语句序列中彼此相继的语句使用相同的缩进量。
示例¶
在这个例子中,if
语句的“then”分支包含单个语句 scream();
。缩进使其看起来好像语句 runAway();
也属于“then”分支,但实际上并非如此:它只是 if
后的下一条语句,无论条件 afraid()
是否评估为真都会执行。
if (afraid())
scream();
runAway();
如果两个语句都打算作为“then”分支的一部分,则应将它们包含在类似这样的语句块中
if (afraid()) {
scream();
runAway();
}
如果第二个语句在逻辑上不属于“then”分支,则应减少其缩进,如下所示
if (afraid())
scream();
runAway();
参考资料¶
Tutorialzine: JavaScript 初学者常犯的 10 个错误.
通用弱点枚举: CWE-483.