Avoid flagging typed exceptions in tuples (#2728)

This commit is contained in:
Charlie Marsh 2023-02-10 13:24:45 -05:00 committed by GitHub
parent 6f58717ba4
commit 812b227334
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 15 deletions

View file

@ -8,7 +8,22 @@ try:
except: except:
continue continue
try:
pass
except (Exception,):
continue
try:
pass
except (Exception, ValueError):
continue
try: try:
pass pass
except ValueError: except ValueError:
continue continue
try:
pass
except (ValueError,):
continue

View file

@ -1,5 +1,7 @@
use rustpython_parser::ast::{Constant, Expr, ExprKind}; use rustpython_parser::ast::{Constant, Expr, ExprKind};
use crate::checkers::ast::Checker;
const PASSWORD_NAMES: [&str; 7] = [ const PASSWORD_NAMES: [&str; 7] = [
"password", "pass", "passwd", "pwd", "secret", "token", "secrete", "password", "pass", "passwd", "pwd", "secret", "token", "secrete",
]; ];
@ -20,3 +22,21 @@ pub fn matches_password_name(string: &str) -> bool {
.iter() .iter()
.any(|name| string.to_lowercase().contains(name)) .any(|name| string.to_lowercase().contains(name))
} }
pub fn is_untyped_exception(type_: Option<&Expr>, checker: &Checker) -> bool {
type_.map_or(true, |type_| {
if let ExprKind::Tuple { elts, .. } = &type_.node {
elts.iter().any(|type_| {
checker.resolve_call_path(type_).map_or(false, |call_path| {
call_path.as_slice() == ["", "Exception"]
|| call_path.as_slice() == ["", "BaseException"]
})
})
} else {
checker.resolve_call_path(type_).map_or(false, |call_path| {
call_path.as_slice() == ["", "Exception"]
|| call_path.as_slice() == ["", "BaseException"]
})
}
})
}

View file

@ -1,9 +1,11 @@
use ruff_macros::{define_violation, derive_message_formats};
use rustpython_parser::ast::{Expr, Stmt, StmtKind}; use rustpython_parser::ast::{Expr, Stmt, StmtKind};
use ruff_macros::{define_violation, derive_message_formats};
use crate::ast::types::Range; use crate::ast::types::Range;
use crate::checkers::ast::Checker; use crate::checkers::ast::Checker;
use crate::registry::Diagnostic; use crate::registry::Diagnostic;
use crate::rules::flake8_bandit::helpers::is_untyped_exception;
use crate::violation::Violation; use crate::violation::Violation;
define_violation!( define_violation!(
@ -26,13 +28,7 @@ pub fn try_except_continue(
) { ) {
if body.len() == 1 if body.len() == 1
&& body[0].node == StmtKind::Continue && body[0].node == StmtKind::Continue
&& (check_typed_exception && (check_typed_exception || is_untyped_exception(type_, checker))
|| type_.map_or(true, |type_| {
checker.resolve_call_path(type_).map_or(true, |call_path| {
call_path.as_slice() == ["", "Exception"]
|| call_path.as_slice() == ["", "BaseException"]
})
}))
{ {
checker.diagnostics.push(Diagnostic::new( checker.diagnostics.push(Diagnostic::new(
TryExceptContinue, TryExceptContinue,

View file

@ -4,6 +4,7 @@ use rustpython_parser::ast::{Expr, Stmt, StmtKind};
use crate::ast::types::Range; use crate::ast::types::Range;
use crate::checkers::ast::Checker; use crate::checkers::ast::Checker;
use crate::registry::Diagnostic; use crate::registry::Diagnostic;
use crate::rules::flake8_bandit::helpers::is_untyped_exception;
use crate::violation::Violation; use crate::violation::Violation;
define_violation!( define_violation!(
@ -26,13 +27,7 @@ pub fn try_except_pass(
) { ) {
if body.len() == 1 if body.len() == 1
&& body[0].node == StmtKind::Pass && body[0].node == StmtKind::Pass
&& (check_typed_exception && (check_typed_exception || is_untyped_exception(type_, checker))
|| type_.map_or(true, |type_| {
checker.resolve_call_path(type_).map_or(true, |call_path| {
call_path.as_slice() == ["", "Exception"]
|| call_path.as_slice() == ["", "BaseException"]
})
}))
{ {
checker.diagnostics.push(Diagnostic::new( checker.diagnostics.push(Diagnostic::new(
TryExceptPass, TryExceptPass,

View file

@ -22,4 +22,24 @@ expression: diagnostics
column: 12 column: 12
fix: ~ fix: ~
parent: ~ parent: ~
- kind:
TryExceptContinue: ~
location:
row: 14
column: 4
end_location:
row: 14
column: 12
fix: ~
parent: ~
- kind:
TryExceptContinue: ~
location:
row: 19
column: 4
end_location:
row: 19
column: 12
fix: ~
parent: ~