microsoft / microsoft/CsWin32

Compiler warnings CS1574 and CS1580 appear in generated code on `<inheritdoc cref="x" />`

Open
#1,658 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
C#
Stars
2.5k
Forks
124
Avg merge
1d 3h
Merged PRs (30d)
9

Description

Hi.

Compiler warnings CS1574 and CS1580 appear in generated code on <inheritdoc cref="x" />.

I did not expect any compiler warnings to appear.

I can add CS1574 and CS1580 to the NoWarn msbuild property, but that will also ignore warnings for other, non-generated code, which is not ideal.

For example:
.\obj\Debug\net8.0-windows\generated\Microsoft.Windows.CsWin32\Microsoft.Windows.CsWin32.SourceGenerator\Windows.Win32.NativeMethods.ADVAPI32.dll.g.cs:

// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

#pragma warning disable CS1591,CS1573,CS0465,CS0649,CS8019,CS1570,CS1584,CS1658,CS0436,CS8981
using global::System;
using global::System.Diagnostics;
using global::System.Diagnostics.CodeAnalysis;
using global::System.Runtime.CompilerServices;
using global::System.Runtime.InteropServices;
using global::System.Runtime.Versioning;
using winmdroot = global::Windows.Win32;
namespace Windows.Win32
{

	/// <content>
	/// Contains extern methods from "ADVAPI32.dll".
	/// </content>
	internal static partial class NativeMethods
	{
		/// <inheritdoc cref="ConvertStringSecurityDescriptorToSecurityDescriptor(winmdroot.Foundation.PCWSTR, uint, winmdroot.Security.PSECURITY_DESCRIPTOR*, uint*)"/>
		[SupportedOSPlatform("windows5.1.2600")]
		[OverloadResolutionPriority(1)]
		internal static unsafe winmdroot.Foundation.BOOL ConvertStringSecurityDescriptorToSecurityDescriptor(string StringSecurityDescriptor, uint StringSDRevision, out winmdroot.Security.PSECURITY_DESCRIPTOR SecurityDescriptor, uint* SecurityDescriptorSize)
		{
			fixed (winmdroot.Security.PSECURITY_DESCRIPTOR* SecurityDescriptorLocal = &SecurityDescriptor)
			{
				fixed (char* StringSecurityDescriptorLocal = StringSecurityDescriptor)
				{
					winmdroot.Foundation.BOOL __result = NativeMethods.ConvertStringSecurityDescriptorToSecurityDescriptor(StringSecurityDescriptorLocal, StringSDRevision, SecurityDescriptorLocal, SecurityDescriptorSize);
					return __result;
				}
			}
		}

		/// <summary>Converts a string-format security descriptor into a valid, functional security descriptor. (Unicode)</summary>
		/// <param name="StringSecurityDescriptor">
		/// <para>A pointer to a null-terminated string containing the <a href="https://docs.microsoft.com/windows/desktop/SecAuthZ/security-descriptor-string-format">string-format security descriptor</a> to convert.</para>
		/// <para><see href="https://learn.microsoft.com/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptorw#parameters">Read more on docs.microsoft.com</see>.</para>
		/// </param>
		/// <param name="StringSDRevision">Specifies the revision level of the <i>StringSecurityDescriptor</i> string. Currently this value must be SDDL_REVISION_1.</param>
		/// <param name="SecurityDescriptor">
		/// <para>A pointer to a variable that receives a pointer to the converted security descriptor. The returned security descriptor is <a href="https://docs.microsoft.com/windows/desktop/SecGloss/s-gly">self-relative</a>. To free the returned buffer, call the <a href="https://docs.microsoft.com/windows/desktop/api/winbase/nf-winbase-localfree">LocalFree</a> function. To convert the security descriptor to an <a href="https://docs.microsoft.com/windows/desktop/SecGloss/a-gly">absolute security descriptor</a>, use the <a href="https://docs.microsoft.com/windows/desktop/api/securitybaseapi/nf-securitybaseapi-makeabsolutesd">MakeAbsoluteSD</a> function.</para>
		/// <para><see href="https://learn.microsoft.com/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptorw#parameters">Read more on docs.microsoft.com</see>.</para>
		/// </param>
		/// <param name="SecurityDescriptorSize">A pointer to a variable that receives the size, in bytes, of the converted security descriptor. This parameter can be NULL.</param>
		/// <returns>
		/// <para>If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call <a href="https://docs.microsoft.com/windows/desktop/api/errhandlingapi/nf-errhandlingapi-getlasterror">GetLastError</a>. <b>GetLastError</b> may return one of the following error codes. </para>
		/// <para>This doc was truncated.</para>
		/// </returns>
		/// <remarks>
		/// <para>If <b>ace_type</b> is ACCESS_ALLOWED_OBJECT_ACE_TYPE and neither <b>object_guid</b> nor <b>inherit_object_guid</b> has a  <a href="https://docs.microsoft.com/windows/win32/api/guiddef/ns-guiddef-guid">GUID</a> specified, then <b>ConvertStringSecurityDescriptorToSecurityDescriptor</b> converts <b>ace_type</b> to ACCESS_ALLOWED_ACE_TYPE. For information about the  <b>ace_type</b>,  <b>object_guid</b>, and <b>inherit_object_guid</b> fields, see <a href="https://docs.microsoft.com/windows/desktop/SecAuthZ/ace-strings">Ace Strings</a>.</para>
		/// <para>> [!NOTE] > The sddl.h header defines ConvertStringSecurityDescriptorToSecurityDescriptor as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see [Conventions for Function Prototypes](/windows/win32/intl/conventions-for-function-prototypes).</para>
		/// <para><see href="https://learn.microsoft.com/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptorw#">Read more on docs.microsoft.com</see>.</para>
		/// </remarks>
		[DllImport("ADVAPI32.dll", ExactSpelling = true, EntryPoint = "ConvertStringSecurityDescriptorToSecurityDescriptorW", SetLastError = true),DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
		[SupportedOSPlatform("windows5.1.2600")]
		internal static extern unsafe winmdroot.Foundation.BOOL ConvertStringSecurityDescriptorToSecurityDescriptor(winmdroot.Foundation.PCWSTR StringSecurityDescriptor, uint StringSDRevision, winmdroot.Security.PSECURITY_DESCRIPTOR* SecurityDescriptor, [Optional] uint* SecurityDescriptorSize);
	}
}

Compiler output:

.\obj\Debug\net8.0-windows\generated\Microsoft.Windows.CsWin32\Microsoft.Windows.CsWin32.SourceGenerator\Windows.Win32.NativeMethods.ADVAPI32.dll.g.cs(26,77,26,104): warning CS1580: Invalid type for parameter winmdroot.Foundation.PCWSTR in XML comment cref attribute: 'ConvertStringSecurityDescriptorToSecurityDescriptor(winmdroot.Foundation.PCWSTR, uint, winmdroot.Security.PSECURITY_DESCRIPTOR*, uint*)'
.\obj\Debug\net8.0-windows\generated\Microsoft.Windows.CsWin32\Microsoft.Windows.CsWin32.SourceGenerator\Windows.Win32.NativeMethods.ADVAPI32.dll.g.cs(26,25,26,160): warning CS1574: XML comment has cref attribute 'ConvertStringSecurityDescriptorToSecurityDescriptor(winmdroot.Foundation.PCWSTR, uint, winmdroot.Security.PSECURITY_DESCRIPTOR*, uint*)' that could not be resolved

NativeMethods.txt:

ConvertStringSecurityDescriptorToSecurityDescriptor

NativeMethods.json:

{
    "$schema": "https://aka.ms/CsWin32.schema.json",
    "allowMarshaling": true,
    "friendlyOverloads": {
        "enabled": true
    },
    "multiTargetingFriendlyAPIs": false,
    "useSafeHandles": true,
    "wideCharOnly": true,
    "emitSingleFile": false,
    "className": "NativeMethods",
    "public": false
}

csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net8.0-windows</TargetFramework>
        <LangVersion>latest</LangVersion>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
    </PropertyGroup>

    <ItemGroup>
      <AdditionalFiles Include="NativeMethods.json" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.183">
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
    </ItemGroup>

</Project>

Thank you.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by building the supplied net8.0-windows reproduction with NativeMethods.txt, NativeMethods.json, and the shown csproj, then inspect the generated Windows.Win32.NativeMethods.ADVAPI32.dll.g.cs file. Trace how the friendly overload's inheritdoc cref is produced; done means the generated code no longer emits CS1574 or CS1580 while warnings in other code remain visible.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.