diff --git a/its/ruling/src/test/resources/expected/python-S4143.json b/its/ruling/src/test/resources/expected/python-S4143.json index 95f431e2f4..8204c245c7 100644 --- a/its/ruling/src/test/resources/expected/python-S4143.json +++ b/its/ruling/src/test/resources/expected/python-S4143.json @@ -30,7 +30,4 @@ 'project:twisted-12.1.0/twisted/test/test_dirdbm.py':[ 26, ], -'project:twisted-12.1.0/twisted/words/protocols/irc.py':[ -2910, -], } diff --git a/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java b/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java index 7edbf805cb..00b772ab3f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java @@ -106,7 +106,7 @@ private static CollectionWrite collectionWrite(AssignmentStatement assignment, E if (collection.is(Kind.SLICE_EXPR, Kind.SUBSCRIPTION)) { CollectionWrite nested = collectionWrite(assignment, collection); if (nested != null) { - return new CollectionWrite(nested.collectionKey.nest(key), nested.leftBracket, rBracket, assignment); + return new CollectionWrite(nested.collectionKey.nest(key), nested.leftBracket, rBracket, assignment, collection); } } @@ -114,7 +114,7 @@ private static CollectionWrite collectionWrite(AssignmentStatement assignment, E Symbol symbol = ((HasSymbol) collection).symbol(); if (symbol != null) { CollectionKey collectionKey = new CollectionKey(symbol, key); - return new CollectionWrite(collectionKey, lBracket, rBracket, assignment); + return new CollectionWrite(collectionKey, lBracket, rBracket, assignment, collection); } } @@ -163,8 +163,7 @@ private static void reportOverwrites(SubscriptionContext ctx, Map CheckUtils.areEquivalent(lhs, t))) { + if (TreeUtils.hasDescendant(assignment.assignedValue(), t -> CheckUtils.areEquivalent(firstWrite.collection, t))) { return; } String message = String.format( @@ -192,12 +191,14 @@ private static class CollectionWrite { private final Token leftBracket; private final Token rightBracket; private final AssignmentStatement assignment; + private final Expression collection; - private CollectionWrite(CollectionKey collectionKey, Token leftBracket, Token rightBracket, AssignmentStatement assignment) { + private CollectionWrite(CollectionKey collectionKey, Token leftBracket, Token rightBracket, AssignmentStatement assignment, Expression collection) { this.collectionKey = collectionKey; this.leftBracket = leftBracket; this.rightBracket = rightBracket; this.assignment = assignment; + this.collection = collection; } } } diff --git a/python-checks/src/test/resources/checks/overwrittenCollectionEntryCheck.py b/python-checks/src/test/resources/checks/overwrittenCollectionEntryCheck.py index 01e652dbe9..bdb29bbd98 100644 --- a/python-checks/src/test/resources/checks/overwrittenCollectionEntryCheck.py +++ b/python-checks/src/test/resources/checks/overwrittenCollectionEntryCheck.py @@ -91,3 +91,13 @@ def non_trivial_collections(f, obj1, obj2): def valid_replacement(list1, foo, x): list1["foo"] = foo(x) list1["foo"] = list1["foo"].replace("a", "b") + +def used_collection(list1): + list1[1] = 42 + list1[1] = foo(list1[1]) + + list1[2] = 42 + list1[2] = foo(list1) + + list[3] = 42 + list[3] = list[1] # FN