Sonarcube v7.8.0.26217 analyzing C# code
The sample program below generates a pair of incorrect warnings on the All() method calls. In both cases it is assuming the invocation is a pure method and the line of code is actually a no-op; but the collection is modified.
This example came from a Stackoverflow question with 462k views, so I’m reasonably sure I’m not the only person who has seen the warning, looked at the code, and thought he could safely delete the line while wondering what the original author was trying to do. This is cut down from actual code where the original data came from a ToList()
ed LINQ query via EF6.
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
BlameStackoverflowForThis();
}
static void BlameStackoverflowForThis()
{
//https://stackoverflow.com/a/6233655/85661
//the abuse of All() seen below is from the above answer
List<TestObject> testList = new List<TestObject> { new TestObject(), new TestObject(), new TestObject() };
IEnumerable<TestObject> testEnum = testList;
//ReSharper warning: Return value of pure method is not used
//but text is changed from null to "foo"
testEnum.All(c => { c.text = "foo"; return true; });
//ReSharper warning: Return value of pure method is not used
//but text is changed from "foo" to "bar"
//in this case testList.ForEach(c => { c.text = "bar"; }); is a
//clean way to do it, but IEnumerable doesn't have a Foreach() method
testList.All(c => { c.text = "bar"; return true; });
}
}
public class TestObject
{
public string text { get; set; }
}
}```