提交 a646d13b 编写于 作者: A AlekseyTs

Improve diagnostics experience for public signing.

- VB: Report a warning about AssemblyKeyFile and AssemblyKeyName attributes being ignored by public signing.
- Disallow public signing for Net modules. The fact that the signing is public is not preserved in a module. The fact of signing is preserved by emitting attributes that are going to be ignored anyway if public signing is used.

Closes #11427.
上级 8d6e20e9
......@@ -7702,6 +7702,15 @@ internal class CSharpResources {
}
}
/// <summary>
/// Looks up a localized string similar to Public signing is not supported for netmodules..
/// </summary>
internal static string ERR_PublicSignNetModule {
get {
return ResourceManager.GetString("ERR_PublicSignNetModule", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The range variable &apos;{0}&apos; has already been declared.
/// </summary>
......
......@@ -3833,6 +3833,9 @@ You should consider suppressing the warning only if you're sure that you don't w
<data name="ERR_PublicSignButNoKey" xml:space="preserve">
<value>Public signing was specified and requires a public key, but no public key was specified.</value>
</data>
<data name="ERR_PublicSignNetModule" xml:space="preserve">
<value>Public signing is not supported for netmodules.</value>
</data>
<data name="WRN_DelaySignButNoKey" xml:space="preserve">
<value>Delay signing was specified and requires a public key, but no public key was specified</value>
</data>
......
......@@ -1449,6 +1449,7 @@ internal enum ErrorCode
ERR_VarInvocationLvalueReserved = 8199,
ERR_ExpressionVariableInConstructorOrFieldInitializer = 8200,
ERR_ExpressionVariableInQueryClause = 8201,
ERR_PublicSignNetModule = 8202,
#endregion more stragglers for C# 7
}
}
......@@ -573,9 +573,16 @@ private void ValidateAttributeSemantics(DiagnosticBag diagnostics)
diagnostics.Add(ErrorCode.WRN_DelaySignButNoKey, NoLocation.Singleton);
}
if (DeclaringCompilation.Options.PublicSign && !Identity.HasPublicKey)
if (DeclaringCompilation.Options.PublicSign)
{
diagnostics.Add(ErrorCode.ERR_PublicSignButNoKey, NoLocation.Singleton);
if (_compilation.Options.OutputKind.IsNetModule())
{
diagnostics.Add(ErrorCode.ERR_PublicSignNetModule, NoLocation.Singleton);
}
else if (!Identity.HasPublicKey)
{
diagnostics.Add(ErrorCode.ERR_PublicSignButNoKey, NoLocation.Singleton);
}
}
// If the options and attributes applied on the compilation imply real signing,
......@@ -790,7 +797,9 @@ private void DetectAttributeAndOptionConflicts(DiagnosticBag diagnostics)
}
}
if (_compilation.Options.PublicSign && (object)this.AssemblyKeyContainerAttributeSetting != (object)CommonAssemblyWellKnownAttributeData.StringMissingValue)
if (_compilation.Options.PublicSign &&
!_compilation.Options.OutputKind.IsNetModule() &&
(object)this.AssemblyKeyContainerAttributeSetting != (object)CommonAssemblyWellKnownAttributeData.StringMissingValue)
{
diagnostics.Add(ErrorCode.WRN_AttributeIgnoredWhenPublicSigning, NoLocation.Singleton, AttributeDescription.AssemblyKeyNameAttribute.FullName);
}
......@@ -825,7 +834,9 @@ private void DetectAttributeAndOptionConflicts(DiagnosticBag diagnostics)
}
}
if (_compilation.Options.PublicSign && (object)this.AssemblyKeyFileAttributeSetting != (object)CommonAssemblyWellKnownAttributeData.StringMissingValue)
if (_compilation.Options.PublicSign &&
!_compilation.Options.OutputKind.IsNetModule() &&
(object)this.AssemblyKeyFileAttributeSetting != (object)CommonAssemblyWellKnownAttributeData.StringMissingValue)
{
diagnostics.Add(ErrorCode.WRN_AttributeIgnoredWhenPublicSigning, NoLocation.Singleton, AttributeDescription.AssemblyKeyFileAttribute.FullName);
}
......
......@@ -423,6 +423,36 @@ public class C {}
Assert.True(identity.HasPublicKey);
AssertEx.Equal(identity.PublicKey, s_publicKey);
Assert.Equal(CorFlags.ILOnly | CorFlags.StrongNameSigned, metadata.Module.PEReaderOpt.PEHeaders.CorHeader.Flags);
c = CreateCompilationWithMscorlib(source, options: TestOptions.ReleaseModule.WithCryptoPublicKey(s_publicKey).WithPublicSign(true));
c.VerifyDiagnostics(
// error CS8201: Public signing is not supported for netmodules.
Diagnostic(ErrorCode.ERR_PublicSignNetModule).WithLocation(1, 1)
);
c = CreateCompilationWithMscorlib(source, options: TestOptions.ReleaseModule.WithCryptoKeyFile(s_publicKeyFile).WithPublicSign(true));
c.VerifyDiagnostics(
// error CS7091: Attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file conflicts with option 'CryptoKeyFile'.
Diagnostic(ErrorCode.ERR_CmdOptionConflictsSource).WithArguments("System.Reflection.AssemblyKeyFileAttribute", "CryptoKeyFile").WithLocation(1, 1),
// error CS8201: Public signing is not supported for netmodules.
Diagnostic(ErrorCode.ERR_PublicSignNetModule).WithLocation(1, 1)
);
var snk = Temp.CreateFile().WriteAllBytes(TestResources.General.snKey);
string source1 = @"
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
[assembly: System.Reflection.AssemblyKeyFile(@""" + snk.Path + @""")]
public class C {}
";
c = CreateCompilationWithMscorlib(source1, options: TestOptions.ReleaseModule.WithCryptoKeyFile(snk.Path).WithPublicSign(true));
c.VerifyDiagnostics(
// error CS8201: Public signing is not supported for netmodules.
Diagnostic(ErrorCode.ERR_PublicSignNetModule).WithLocation(1, 1)
);
}
[Fact, WorkItem(9150, "https://github.com/dotnet/roslyn/issues/9150")]
......
......@@ -1721,6 +1721,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
ERR_NewWithTupleTypeSyntax = 37280
ERR_PredefinedValueTupleTypeMustBeStruct = 37281
ERR_PublicSignNetModule = 37282
'// WARNINGS BEGIN HERE
WRN_UseOfObsoleteSymbol2 = 40000
......@@ -1941,7 +1942,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
WRN_NoAnalyzerInAssembly = 42377
WRN_UnableToLoadAnalyzer = 42378
' // AVAILABLE 42379 - 49998
WRN_AttributeIgnoredWhenPublicSigning = 42379
' // AVAILABLE 42380 - 49998
ERRWRN_Last = WRN_UnableToLoadAnalyzer + 1
'// HIDDENS AND INFOS BEGIN HERE
......
......@@ -1193,8 +1193,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
diagnostics.Add(ERRID.WRN_DelaySignButNoKey, NoLocation.Singleton)
End If
If DeclaringCompilation.Options.PublicSign AndAlso Not Identity.HasPublicKey Then
diagnostics.Add(ERRID.ERR_PublicSignNoKey, NoLocation.Singleton)
If DeclaringCompilation.Options.PublicSign Then
If DeclaringCompilation.Options.OutputKind.IsNetModule() Then
diagnostics.Add(ERRID.ERR_PublicSignNetModule, NoLocation.Singleton)
ElseIf Not Identity.HasPublicKey Then
diagnostics.Add(ERRID.ERR_PublicSignNoKey, NoLocation.Singleton)
End If
End If
' If the options and attributes applied on the compilation imply real signing,
......@@ -1274,6 +1278,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
diagnostics.Add(ERRID.ERR_CmdOptionConflictsSource, NoLocation.Singleton, AttributeDescription.AssemblyKeyFileAttribute.FullName, "CryptoKeyFile")
End If
End If
ElseIf _compilation.Options.PublicSign Then
If Me.AssemblyKeyContainerAttributeSetting IsNot CommonAssemblyWellKnownAttributeData.StringMissingValue Then
diagnostics.Add(ERRID.WRN_AttributeIgnoredWhenPublicSigning, NoLocation.Singleton, AttributeDescription.AssemblyKeyNameAttribute.FullName)
End If
If Me.AssemblyKeyFileAttributeSetting IsNot CommonAssemblyWellKnownAttributeData.StringMissingValue Then
diagnostics.Add(ERRID.WRN_AttributeIgnoredWhenPublicSigning, NoLocation.Singleton, AttributeDescription.AssemblyKeyFileAttribute.FullName)
End If
End If
End Sub
......
......@@ -9324,6 +9324,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Public signing is not supported for netmodules..
'''</summary>
Friend ReadOnly Property ERR_PublicSignNetModule() As String
Get
Return ResourceManager.GetString("ERR_PublicSignNetModule", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Public sign was specified and requires a public key, but no public key was specified.
'''</summary>
......@@ -12675,6 +12684,24 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Attribute &apos;{0}&apos; is ignored when public signing is specified..
'''</summary>
Friend ReadOnly Property WRN_AttributeIgnoredWhenPublicSigning() As String
Get
Return ResourceManager.GetString("WRN_AttributeIgnoredWhenPublicSigning", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Attribute is ignored when public signing is specified..
'''</summary>
Friend ReadOnly Property WRN_AttributeIgnoredWhenPublicSigning_Title() As String
Get
Return ResourceManager.GetString("WRN_AttributeIgnoredWhenPublicSigning_Title", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Bad checksum value, non hex digits or odd number of hex digits..
'''</summary>
......
......@@ -4340,6 +4340,15 @@
<data name="ERR_PublicSignNoKey" xml:space="preserve">
<value>Public sign was specified and requires a public key, but no public key was specified</value>
</data>
<data name="ERR_PublicSignNetModule" xml:space="preserve">
<value>Public signing is not supported for netmodules.</value>
</data>
<data name="WRN_AttributeIgnoredWhenPublicSigning" xml:space="preserve">
<value>Attribute '{0}' is ignored when public signing is specified.</value>
</data>
<data name="WRN_AttributeIgnoredWhenPublicSigning_Title" xml:space="preserve">
<value>Attribute is ignored when public signing is specified.</value>
</data>
<data name="WRN_DelaySignButNoKey" xml:space="preserve">
<value>Delay signing was specified and requires a public key, but no public key was specified.</value>
</data>
......
......@@ -337,7 +337,8 @@ End Class
End Sub
<Fact>
Public Sub PublicKeyFromOptions_OssSigned()
<WorkItem(11427, "https://github.com/dotnet/roslyn/issues/11427")>
Public Sub PublicKeyFromOptions_PublicSign()
' attributes are ignored
Dim source =
<compilation>
......@@ -350,8 +351,13 @@ End Class
</file>
</compilation>
Dim c = CreateCompilationWithMscorlib(source, options:=TestOptions.ReleaseDll.WithCryptoPublicKey(s_publicKey))
c.VerifyDiagnostics()
Dim c = CreateCompilationWithMscorlib(source, options:=TestOptions.ReleaseDll.WithCryptoPublicKey(s_publicKey).WithPublicSign(True))
c.AssertTheseDiagnostics(
<expected>
BC42379: Attribute 'System.Reflection.AssemblyKeyFileAttribute' is ignored when public signing is specified.
BC42379: Attribute 'System.Reflection.AssemblyKeyNameAttribute' is ignored when public signing is specified.
</expected>
)
Assert.True(ByteSequenceComparer.Equals(s_publicKey, c.Assembly.Identity.PublicKey))
Dim Metadata = ModuleMetadata.CreateFromImage(c.EmitToArray())
......@@ -360,6 +366,41 @@ End Class
Assert.True(identity.HasPublicKey)
AssertEx.Equal(identity.PublicKey, s_publicKey)
Assert.Equal(CorFlags.ILOnly Or CorFlags.StrongNameSigned, Metadata.Module.PEReaderOpt.PEHeaders.CorHeader.Flags)
c = CreateCompilationWithMscorlib(source, options:=TestOptions.ReleaseModule.WithCryptoPublicKey(s_publicKey).WithPublicSign(True))
c.AssertTheseDiagnostics(
<expected>
BC37282: Public signing is not supported for netmodules.
</expected>
)
c = CreateCompilationWithMscorlib(source, options:=TestOptions.ReleaseModule.WithCryptoKeyFile(s_publicKeyFile).WithPublicSign(True))
c.AssertTheseDiagnostics(
<expected>
BC37207: Attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file conflicts with option 'CryptoKeyFile'.
BC37282: Public signing is not supported for netmodules.
</expected>
)
Dim snk = Temp.CreateFile().WriteAllBytes(TestResources.General.snKey)
Dim source1 =
<compilation>
<file name="a.vb"><![CDATA[
<assembly: System.Reflection.AssemblyKeyName("roslynTestContainer")>
<assembly: System.Reflection.AssemblyKeyFile("]]><%= snk.Path %><![CDATA[")>
Public Class C
End Class
]]>
</file>
</compilation>
c = CreateCompilationWithMscorlib(source1, options:=TestOptions.ReleaseModule.WithCryptoKeyFile(snk.Path).WithPublicSign(True))
c.AssertTheseDiagnostics(
<expected>
BC37282: Public signing is not supported for netmodules.
</expected>
)
End Sub
<Fact>
......@@ -1706,14 +1747,17 @@ End Class
PublicSignCore(compilation)
End Sub
Public Sub PublicSignCore(compilation As Compilation)
Public Sub PublicSignCore(compilation As Compilation, Optional assertNoDiagnostics As Boolean = True)
Assert.True(compilation.Options.PublicSign)
Assert.Null(compilation.Options.DelaySign)
Dim stream As New MemoryStream()
Dim emitResult = compilation.Emit(stream)
Assert.True(emitResult.Success)
Assert.True(emitResult.Diagnostics.IsEmpty)
If assertNoDiagnostics Then
Assert.True(emitResult.Diagnostics.IsEmpty)
End If
stream.Position = 0
Using reader As New PEReader(stream)
......@@ -1759,6 +1803,7 @@ End Class
AssertTheseDiagnostics(c,
<errors>
BC37254: Public sign was specified and requires a public key, but no public key was specified
BC42379: Attribute 'System.Reflection.AssemblyKeyFileAttribute' is ignored when public signing is specified.
</errors>)
Assert.True(c.Options.PublicSign)
......@@ -1778,6 +1823,7 @@ End Class
AssertTheseDiagnostics(c,
<errors>
BC37254: Public sign was specified and requires a public key, but no public key was specified
BC42379: Attribute 'System.Reflection.AssemblyKeyNameAttribute' is ignored when public signing is specified.
</errors>)
Assert.True(c.Options.PublicSign)
......@@ -1845,7 +1891,14 @@ End Class
Dim snk = Temp.CreateFile().WriteAllBytes(TestResources.General.snKey)
Dim options = TestOptions.ReleaseDll.WithCryptoKeyFile(snk.Path).WithPublicSign(True)
Dim compilation = CreateCompilationWithMscorlib(source, options:=options)
PublicSignCore(compilation)
AssertTheseDiagnostics(compilation,
<errors>
BC42379: Attribute 'System.Reflection.AssemblyKeyFileAttribute' is ignored when public signing is specified.
BC42379: Attribute 'System.Reflection.AssemblyKeyNameAttribute' is ignored when public signing is specified.
</errors>)
PublicSignCore(compilation, assertNoDiagnostics:=False)
End Sub
<Fact>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册