Files
codeql/csharp/ql/test/library-tests/controlflow/guards/Guards.cs
Anders Schack-Mulligen dc029e8da9 C#: Accept qltest weirdness.
2025-11-14 11:38:13 +01:00

352 lines
8.0 KiB
C#

using System;
#nullable enable
public class Guards
{
public string? Field;
public Guards? Property { get; set; }
void M1(string? s)
{
if (!!(s == null))
return;
if (s.Length > 0)
{ // null guarded
Console.WriteLine(s); // null guarded
}
else
{
Console.WriteLine("<empty string>");
}
}
void M2(string? s)
{
if (s != null)
{
Console.WriteLine(s); // null guarded
}
}
void M3(string? x, string? y)
{
if (!string.IsNullOrEmpty(x) & !(y == null))
Console.WriteLine(x + y); // null guarded
if (x == null || y == null) { }
else Console.WriteLine(x + y); // null guarded
if (!(x == null || y == null)) // MISHANDLED, likely due to splitting
Console.WriteLine(x + y); // null guarded
if (!!!(x != null && y != null)) { } // MISHANDLED, likely due to splitting
else Console.WriteLine(x + y); // null guarded
if (Field != null)
Console.WriteLine(new Guards().Field); // not null guarded
if (Field != null)
Console.WriteLine(this.Field);
}
void M4(Guards g)
{
if (g.Field == null)
return;
Console.WriteLine(g.Field); // null guarded
}
void M5(Guards g)
{
if (g.Property.Property.Field == null)
throw new Exception();
Console.WriteLine(g.Property.Property.Field); // null guarded
Console.WriteLine(g.Property.Field); // not null guarded
}
void M6(string? s)
{
while (s != null)
{
Console.WriteLine(s); // null guarded
s = null;
Console.WriteLine(s); // not null guarded
}
}
void M7(string? s)
{
if (s?.Length == 0)
Console.WriteLine(s); // null guarded
if (s?.Length > 0)
Console.WriteLine(s); // null guarded
if (s?.Length >= 0)
Console.WriteLine(s); // null guarded
if (s?.Length < 10)
Console.WriteLine(s); // null guarded
if (s?.Length <= 10)
Console.WriteLine(s); // null guarded
if (s?.Length != null)
Console.WriteLine(s); // null guarded
else
Console.WriteLine(s); // not null guarded
if (s?.Length - 1 != 0)
Console.WriteLine(s); // not null guarded
else
Console.WriteLine(s); // null guarded
if (s == "")
Console.WriteLine(s); // null guarded
else
Console.WriteLine(s); // not null guarded
}
void M8(Guards g)
{
if (g.Property.Property.Field == null)
throw new Exception();
g.Property = null;
Console.WriteLine(g.Property.Property.Field); // not null guarded
Console.WriteLine(g.Property.Field); // not null guarded
}
void M9(Guards g)
{
var dummy = g.Property.Property.Field
?? g.Property.Property.Field; // not null guarded
dummy = g.Property.Property.Field ?? throw null;
Console.WriteLine(g.Property.Property.Field); // null guarded
g.Property = null;
Console.WriteLine(g.Property.Property.Field); // not null guarded
Console.WriteLine(g.Property.Field); // not null guarded
}
void M10(string? s1, string? s2)
{
var b1 = s1.Equals(s2); // not null guarded
var b2 = s1?.Equals(s1); // null guarded
}
int M11(string? s)
{
if (s is null)
return s.Length; // not null guarded
return s.Length; // null guarded
}
int M12(string? s)
{
if (s is string _)
return s.Length; // null guarded
return s.Length; // not null guarded
}
string M13(object? o)
{
if (o is string s)
return s; // not null (but not a guard)
return o.ToString(); // not null guarded
}
string M14(object? o)
{
switch (o)
{
case Action<object> _:
return o.ToString(); // null guarded
case Action<string> a:
return a.ToString(); // not null (but not a guard)
case "":
return o.ToString(); // null guarded
case null:
return o.ToString(); // not null guarded
default:
return o.ToString(); // null guarded
}
}
void M15(string? x)
{
if (!string.IsNullOrWhiteSpace(x))
Console.WriteLine(x); // null guarded
}
bool NullTest1(object? o) => o == null;
bool NullTest2(object? o)
{
if (o is null)
return true;
return false;
}
bool NullTest3(object? o) => o == null ? true : false;
bool NotNullTest4(object? o) => !NullTest3(o);
bool NullTestWrong(object? o) => o == null ? true : true;
void M16(string? s)
{
if (!NullTest1(s))
Console.WriteLine(s); // null guarded
if (!NullTest2(s))
Console.WriteLine(s); // null guarded
if (!NullTest3(s))
Console.WriteLine(s); // null guarded
if (NotNullTest4(s))
Console.WriteLine(s); // null guarded
if (!NullTestWrong(s))
Console.WriteLine(s); // not null guarded
}
void M17(object? o, string[] args)
{
if (o != null)
{
o.ToString(); // null guarded
foreach (var arg in args)
{
o.ToString(); // null guarded
}
}
}
void M18(bool b1)
{
var b2 = true;
if (b1)
b2 = false;
switch (b2)
{
case true:
return;
return;
}
}
void M19(bool b1)
{
var b2 = false;
if (b1)
b2 = true;
switch (b2)
{
case true:
return;
return;
}
}
void M20(bool b)
{
var i = 0;
if (b)
i = 1;
switch (i)
{
case 1:
return;
return;
}
}
enum E { A, B, C }
void M21(bool b)
{
var e = E.A;
if (b)
e = E.B;
switch (e)
{
case E.B:
return;
return;
}
}
void M22(object? o1, object? o2)
{
if (o1?.GetType() == o2.GetType())
o1.ToString(); // null guarded
if (o1?.GetType() == o2?.GetType())
o1.ToString(); // not null guarded
}
string M23(object? o)
{
return o switch
{
Action<object> _ =>
o.ToString(), // null guarded
Action<string> a =>
a.ToString(), // not null (but not a guard)
"" =>
o.ToString(), // null guarded
null =>
o.ToString(), // not null guarded
_ =>
o.ToString() // null guarded
};
}
int M24(bool b1)
{
var b2 = true;
if (b1)
b2 = false;
return b2 switch
{
true => 0,
_ => 1
};
}
int M25(bool b1)
{
var b2 = false;
if (b1)
b2 = true;
return b2 switch
{
true => 0,
_ => 1
};
}
int M26(bool b)
{
var i = 0;
if (b)
i = 1;
return i switch
{
1 => 0,
_ => 1
};
}
int M27(bool b)
{
var e = E.A;
if (b)
e = E.B;
return e switch
{
E.B => 0,
_ => 1
};
}
void M28(bool b)
{
string s = b ? null : "";
if (s != null && !b)
Console.WriteLine(s.Length); // null guarded
}
void M29(object? o)
{
if (o is not null)
o.ToString(); // null guarded
}
}