diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/Class1.cs_ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/Class1.cs_ deleted file mode 100644 index ed948c053d05..000000000000 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/Class1.cs_ +++ /dev/null @@ -1,42 +0,0 @@ -using System; - -namespace DisposalTests -{ - public class MyType : IDisposable - { - public void Dispose() - { - } - } - - public class Class1 : IDisposable - { - public void DisposesParameter(IDisposable p1, IDisposable p2) - { - p1.Dispose(); - } - - public void CapturesDisposable(MyType p1, MyType p2) - { - field1 = p1; - field2 = p2; - } - - public void DisposesSelf() - { - Dispose(); - } - - MyType field1, field2; - - public void Dispose() - { - field1.Dispose(); - } - - public static void Dispose(IDisposable d) - { - d.Dispose(); - } - } -} diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/DisposalTests.dll b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/DisposalTests.dll deleted file mode 100644 index f731c5af9e11..000000000000 Binary files a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/DisposalTests.dll and /dev/null differ diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs index 457c1ae4b40d..aa11be14f67b 100644 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs +++ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs @@ -1,10 +1,11 @@ using System; -using System.Text; using System.IO; using System.IO.Compression; -using System.Xml; +using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Xml; class Test { @@ -48,9 +49,9 @@ public IDisposable Method() } // BAD: No Dispose call - var c1d = new Timer(TimerProc); - var fs = new FileStream("", FileMode.CreateNew, FileAccess.Write); - new FileStream("", FileMode.CreateNew, FileAccess.Write).Fluent(); + var c1d = new Timer(TimerProc); // $ Alert + var fs = new FileStream("", FileMode.CreateNew, FileAccess.Write); // $ Alert + new FileStream("", FileMode.CreateNew, FileAccess.Write).Fluent(); // $ Alert // GOOD: Disposed via wrapper fs = new FileStream("", FileMode.CreateNew, FileAccess.Write); @@ -72,13 +73,10 @@ public IDisposable Method() ; // GOOD: XmlDocument.Load disposes incoming XmlReader (False positive as this is disposed in library code) - var xmlReader = XmlReader.Create(new StringReader("xml"), null); + var xmlReader = XmlReader.Create(new StringReader("xml"), null); // $ Alert var xmlDoc = new XmlDocument(); xmlDoc.Load(xmlReader); - // GOOD: Passed to a library (False positive as this is disposed in library code). - DisposalTests.Class1.Dispose(new StreamWriter("output.txt")); - // GOOD: Disposed automatically. using var c2 = new Timer(TimerProc); @@ -97,6 +95,15 @@ public IDisposable Method() return null; } + public void M(IHttpClientFactory factory) + { + // GOOD: Factory tracks and disposes. + HttpClient client1 = factory.CreateClient(); + + // BAD: No Dispose call + var client2 = new HttpClient(); // $ Alert + } + // GOOD: Escapes IDisposable Create() => new Timer(TimerProc); @@ -107,6 +114,15 @@ void TimerProc(object obj) public void Dispose() { } } +class Bad +{ + long GetLength(string file) + { + var stream = new FileStream(file, FileMode.Open); // $ Alert + return stream.Length; + } +} + static class Extensions { public static FileStream Fluent(this FileStream fs) => fs; diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.expected b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.expected index 1a72517edb8b..f08cf6837c5f 100644 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.expected +++ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.expected @@ -1,7 +1,7 @@ -| NoDisposeCallOnLocalIDisposable.cs:51:19:51:38 | object creation of type Timer | Disposable 'Timer' is created but not disposed. | -| NoDisposeCallOnLocalIDisposable.cs:52:18:52:73 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | -| NoDisposeCallOnLocalIDisposable.cs:53:9:53:64 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | -| NoDisposeCallOnLocalIDisposable.cs:75:25:75:71 | call to method Create | Disposable 'XmlReader' is created but not disposed. | -| NoDisposeCallOnLocalIDisposable.cs:75:42:75:64 | object creation of type StringReader | Disposable 'StringReader' is created but not disposed. | -| NoDisposeCallOnLocalIDisposable.cs:80:38:80:67 | object creation of type StreamWriter | Disposable 'StreamWriter' is created but not disposed. | -| NoDisposeCallOnLocalIDisposableBad.cs:8:22:8:56 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:52:19:52:38 | object creation of type Timer | Disposable 'Timer' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:53:18:53:73 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:54:9:54:64 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:76:25:76:71 | call to method Create | Disposable 'XmlReader' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:76:42:76:64 | object creation of type StringReader | Disposable 'StringReader' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:104:23:104:38 | object creation of type HttpClient | Disposable 'HttpClient' is created but not disposed. | +| NoDisposeCallOnLocalIDisposable.cs:121:22:121:56 | object creation of type FileStream | Disposable 'FileStream' is created but not disposed. | diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.qlref b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.qlref index 3f71b594f228..67155fa1e447 100644 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.qlref +++ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.qlref @@ -1 +1,2 @@ -API Abuse/NoDisposeCallOnLocalIDisposable.ql \ No newline at end of file +query: API Abuse/NoDisposeCallOnLocalIDisposable.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposableBad.cs b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposableBad.cs deleted file mode 100644 index 9f8bb3e8e002..000000000000 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposableBad.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.IO; - -class Bad -{ - long GetLength(string file) - { - var stream = new FileStream(file, FileMode.Open); - return stream.Length; - } -} diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/options b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/options index f12c8c66331e..ef338c0b1c12 100644 --- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/options +++ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/options @@ -1 +1,2 @@ -semmle-extractor-options: /r:System.Private.Xml.dll /r:System.IO.Compression.dll +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj