Skip to content

Commit ffaa72a

Browse files
Fix S1313 FN: Support utf-8 literals and add support utf8 string literals in CSharpFacade (#6471)
1 parent b910cd0 commit ffaa72a

8 files changed

Lines changed: 46 additions & 12 deletions

File tree

analyzers/src/SonarAnalyzer.CSharp/Facade/CSharpSyntaxKindFacade.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ internal sealed class CSharpSyntaxKindFacade : ISyntaxKindFacade<SyntaxKind>
5454
public SyntaxKind ReturnStatement => SyntaxKind.ReturnStatement;
5555
public SyntaxKind SimpleAssignment => SyntaxKind.SimpleAssignmentExpression;
5656
public SyntaxKind SimpleMemberAccessExpression => SyntaxKind.SimpleMemberAccessExpression;
57-
public SyntaxKind StringLiteralExpression => SyntaxKind.StringLiteralExpression;
57+
public SyntaxKind[] StringLiteralExpressions => new[] { SyntaxKind.StringLiteralExpression, SyntaxKindEx.Utf8StringLiteralExpression };
5858
public SyntaxKind[] TypeDeclaration => new[]
5959
{
6060
SyntaxKind.ClassDeclaration,

analyzers/src/SonarAnalyzer.Common/Facade/ISyntaxKindFacade.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public interface ISyntaxKindFacade<out TSyntaxKind>
4343
abstract TSyntaxKind ReturnStatement { get; }
4444
abstract TSyntaxKind SimpleAssignment { get; }
4545
abstract TSyntaxKind SimpleMemberAccessExpression { get; }
46-
abstract TSyntaxKind StringLiteralExpression { get; }
46+
abstract TSyntaxKind[] StringLiteralExpressions { get; }
4747
abstract TSyntaxKind[] TypeDeclaration { get; }
4848
abstract TSyntaxKind LeftShiftExpression { get; }
4949
abstract TSyntaxKind RightShiftExpression { get; }

analyzers/src/SonarAnalyzer.Common/Helpers/StringValueHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public string GetStringValue(SyntaxNode node, SemanticModel semanticModel)
3535
{
3636
if (node != null)
3737
{
38-
if (Language.Syntax.IsKind(node, Language.SyntaxKind.StringLiteralExpression)
38+
if (Language.Syntax.IsAnyKind(node, Language.SyntaxKind.StringLiteralExpressions)
3939
&& node is TLiteralExpressionSyntax literal)
4040
{
4141
return Token(literal).ValueText;

analyzers/src/SonarAnalyzer.Common/Rules/Hotspots/HardcodedIpAddressBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected HardcodedIpAddressBase(IAnalyzerConfiguration analyzerConfiguration) :
6565

6666
protected override void Initialize(SonarAnalysisContext context)
6767
{
68-
context.RegisterSyntaxNodeActionInNonGenerated(Language.GeneratedCodeRecognizer, CheckForHardcodedIpAddressesInStringLiteral, Language.SyntaxKind.StringLiteralExpression);
68+
context.RegisterSyntaxNodeActionInNonGenerated(Language.GeneratedCodeRecognizer, CheckForHardcodedIpAddressesInStringLiteral, Language.SyntaxKind.StringLiteralExpressions);
6969
context.RegisterSyntaxNodeActionInNonGenerated(Language.GeneratedCodeRecognizer, CheckForHardcodedIpAddressesInStringInterpolation, Language.SyntaxKind.InterpolatedStringExpression);
7070
}
7171

analyzers/src/SonarAnalyzer.Common/Rules/Hotspots/PubliclyWritableDirectoriesBase.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ protected PubliclyWritableDirectoriesBase(IAnalyzerConfiguration configuration)
7171

7272
protected override void Initialize(SonarAnalysisContext context)
7373
{
74+
var kinds = Language.SyntaxKind.StringLiteralExpressions.ToList();
75+
kinds.Add(Language.SyntaxKind.InterpolatedStringExpression);
76+
7477
context.RegisterSyntaxNodeActionInNonGenerated(
7578
Language.GeneratedCodeRecognizer,
7679
c =>
@@ -82,8 +85,7 @@ protected override void Initialize(SonarAnalysisContext context)
8285
c.ReportIssue(Diagnostic.Create(rule, c.Node.GetLocation()));
8386
}
8487
},
85-
Language.SyntaxKind.StringLiteralExpression,
86-
Language.SyntaxKind.InterpolatedStringExpression);
88+
kinds.ToArray());
8789

8890
context.RegisterSyntaxNodeActionInNonGenerated(
8991
Language.GeneratedCodeRecognizer,

analyzers/src/SonarAnalyzer.VisualBasic/Facade/VisualBasicSyntaxKindFacade.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ internal sealed class VisualBasicSyntaxKindFacade : ISyntaxKindFacade<SyntaxKind
5050
public SyntaxKind ReturnStatement => SyntaxKind.ReturnStatement;
5151
public SyntaxKind SimpleAssignment => SyntaxKind.SimpleAssignmentStatement;
5252
public SyntaxKind SimpleMemberAccessExpression => SyntaxKind.SimpleMemberAccessExpression;
53-
public SyntaxKind StringLiteralExpression => SyntaxKind.StringLiteralExpression;
53+
public SyntaxKind[] StringLiteralExpressions => new[] { SyntaxKind.StringLiteralExpression };
5454
public SyntaxKind[] TypeDeclaration => new[] { SyntaxKind.ClassBlock, SyntaxKind.StructureBlock, SyntaxKind.InterfaceBlock, SyntaxKind.EnumBlock };
5555
public SyntaxKind LeftShiftExpression => SyntaxKind.LeftShiftExpression;
5656
public SyntaxKind RightShiftExpression => SyntaxKind.RightShiftExpression;

analyzers/tests/SonarAnalyzer.UnitTest/TestCases/Hotspots/HardcodedIpAddress.CSharp11.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ public class HardcodedIpAddress
88
public void RawStringLiterals(string unknownPart, string knownPart)
99
{
1010
string ip1 = """192.168.0.1"""; // Noncompliant {{Make sure using this hardcoded IP address '192.168.0.1' is safe here.}}
11-
var ip2 = "192.168.0.1"u8; // FN
12-
var ip3 = """192.168.0.1"""u8; // FN
13-
var ip4 = """
11+
var ip2 = "192.168.0.1"u8; // Noncompliant
12+
var ip3 = "\x31\x39\x32\x2E\x31\x36\x38\x2E\x30\x2E\x31"u8; // Noncompliant - this is 192.168.0.1 in utf-8
13+
var ip4 = """192.168.0.1"""u8; // Noncompliant
14+
var ip5 = """
1415
192.168.0.1
15-
"""u8; // FN
16+
"""u8; // Noncompliant@-2
1617
}
1718

1819
public void NewlinesInStringInterpolation()

analyzers/tests/SonarAnalyzer.UnitTest/TestCases/Hotspots/PubliclyWritableDirectories.CSharp11.cs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class Program
77
{
88
void RawStringLiterals()
99
{
10-
var tmp = Environment.GetEnvironmentVariable("""TMPDIR"""); // Noncompliant
10+
var tmp = Environment.GetEnvironmentVariable("""TMPDIR"""); // Noncompliant
1111
}
1212

1313
void NewlinesInStringInterpolation(string firstPartOfPath, string secondPartOfPath)
@@ -17,5 +17,36 @@ void NewlinesInStringInterpolation(string firstPartOfPath, string secondPartOfPa
1717
string dirRawString = $$"""/tmp/{{firstPartOfPath + // Noncompliant
1818
secondPartOfPath}}""";
1919
}
20+
21+
void Utf8StringLiterals()
22+
{
23+
var tmp = "%USERPROFILE%\\AppData\\Local\\Temp\\f"u8; // Noncompliant
24+
tmp = "%TEMP%\\f"u8; // Noncompliant
25+
tmp = "/tmp/"u8; // Noncompliant
26+
tmp = "/tmp"u8; // Noncompliant
27+
tmp = "/var/tmp/f"u8; // Noncompliant
28+
tmp = "/usr/tmp/f"u8; // Noncompliant
29+
tmp = "/dev/shm/f"u8; // Noncompliant
30+
tmp = "/dev/mqueue/f"u8; // Noncompliant
31+
tmp = "/run/lock/f"u8; // Noncompliant
32+
tmp = "/var/run/lock/f"u8; // Noncompliant
33+
tmp = "/Library/Caches/f"u8; // Noncompliant
34+
tmp = "/Users/Shared/f"u8; // Noncompliant
35+
tmp = "/private/tmp/f"u8; // Noncompliant
36+
tmp = "/private/var/tmp/"u8; // Noncompliant
37+
tmp = "C:\\Windows\\Temp\\f"u8; // Noncompliant
38+
tmp = "C:\\Temp\\f"u8; // Noncompliant
39+
tmp = "C:\\TEMP\\f"u8; // Noncompliant
40+
tmp = "C:\\TMP\\f"u8; // Noncompliant
41+
tmp = @"/tmp/f"u8; // Noncompliant
42+
tmp = "D:\\Windows\\Temp\\f"u8; // Noncompliant
43+
tmp = "\\\\Server_Name\\Temp\\f"u8; // Noncompliant
44+
tmp = "\\Windows\\Temp\\f"u8; // Noncompliant
45+
tmp = @"C:\Windows\Temp\f"u8; // Noncompliant
46+
tmp = @"D:\Windows\Temp\f"u8; // Noncompliant
47+
tmp = @"\\Windows\Temp\f"u8; // Noncompliant
48+
tmp = @"\Windows\Temp\f"u8; // Noncompliant
49+
}
50+
2051
}
2152
}

0 commit comments

Comments
 (0)