From f30c7551dd12b06f0365df6e77d0334b1902397a Mon Sep 17 00:00:00 2001 From: Yuting Chen Date: Thu, 25 Jun 2015 13:42:33 -0700 Subject: [PATCH] Fix false positive for UsingInternalURL Add check if -replace is used and check if invocation expression is [String] or [System.String] --- Rules/AvoidUsingInternalURLs.cs | 19 +++++++++++++++++-- .../AvoidUsingInternalURLsNoViolations.ps1 | 4 +++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Rules/AvoidUsingInternalURLs.cs b/Rules/AvoidUsingInternalURLs.cs index 99844de4f..90c880909 100644 --- a/Rules/AvoidUsingInternalURLs.cs +++ b/Rules/AvoidUsingInternalURLs.cs @@ -11,8 +11,10 @@ // using System; +using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Management.Automation.Language; using Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic; using System.ComponentModel.Composition; @@ -44,8 +46,19 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) { foreach (StringConstantExpressionAst expressionAst in expressionAsts) { - //Check if XPath is used. If XPath is used, then we don't throw warnings. + Ast parentAst = expressionAst.Parent; + //Check if -replace is used, if it is string replace, we don't throw warnings. + Ast grandParentAst = parentAst.Parent; + if (grandParentAst is BinaryExpressionAst) + { + if ((grandParentAst as BinaryExpressionAst).Operator.Equals(TokenKind.Ireplace)) + { + continue; + } + } + + //Check if XPath is used. If XPath is used, then we don't throw warnings. if (parentAst is InvokeMemberExpressionAst) { InvokeMemberExpressionAst invocation = parentAst as InvokeMemberExpressionAst; @@ -55,7 +68,9 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) String.Equals(invocation.Member.ToString(), "SelectNodes",StringComparison.OrdinalIgnoreCase) || String.Equals(invocation.Member.ToString(), "Select", StringComparison.OrdinalIgnoreCase) || String.Equals(invocation.Member.ToString(), "Evaluate",StringComparison.OrdinalIgnoreCase) || - String.Equals(invocation.Member.ToString(), "Matches",StringComparison.OrdinalIgnoreCase)) + String.Equals(invocation.Member.ToString(), "Matches",StringComparison.OrdinalIgnoreCase) || + String.Equals(invocation.Expression.ToString(), "[System.String]",StringComparison.OrdinalIgnoreCase) || + String.Equals(invocation.Expression.ToString(), "[String]", StringComparison.OrdinalIgnoreCase)) { continue; } diff --git a/Tests/Rules/AvoidUsingInternalURLsNoViolations.ps1 b/Tests/Rules/AvoidUsingInternalURLsNoViolations.ps1 index 337bb0832..1d28e5baa 100644 --- a/Tests/Rules/AvoidUsingInternalURLsNoViolations.ps1 +++ b/Tests/Rules/AvoidUsingInternalURLsNoViolations.ps1 @@ -5,4 +5,6 @@ function Test { $filesNode = $infoXml.SelectSingleNode("//files") } -$sd = "O:BAG:BAD:(A;;0x800;;;WD)(A;;0x120fff;;;SY)(A;;0x120fff;;;LS)(A;;0x120fff;;;NS)(A;;0x120fff;;;BA)(A;;0xee5;;;LU)(A;;LC;;;MU)(A;;0x800;;;AG)" \ No newline at end of file +$sd = "O:BAG:BAD:(A;;0x800;;;WD)(A;;0x120fff;;;SY)(A;;0x120fff;;;LS)(A;;0x120fff;;;NS)(A;;0x120fff;;;BA)(A;;0xee5;;;LU)(A;;LC;;;MU)(A;;0x800;;;AG)" +$msg = [System.String]::Format("1:{0}", "test") + $internalId = $Id -replace '^([^/])','/$1' -as $Id.GetType() \ No newline at end of file