在我的C++Windows服务代码中获取C26xxx错误



我的代码中出现错误。代码可以编译,但我仍然希望去掉这些警告。我查看了stackoverflow和谷歌,点击了警告,这些警告将我带到microsoft.com页面,并对每一个进行了解释,但我没有看到如何消除它们的具体例子。

以下是C++代码和警告。

void WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv);
VOID main() noexcept
{
CONST SERVICE_TABLE_ENTRY ste[] = { {L"MyService", ServiceMain}, {NULL, NULL} };
//C26485    Expression 'ste': No array to pointer decay (bounds.3).
StartServiceCtrlDispatcherW(ste); 
}
// C26429 Symbol 'lpszArgv' is never tested for nullness, it can be marked as not_null (f.23).
// C26461 The pointer argument 'lpszArgv' for function 'ServiceMain' can be marked as a pointer to const (con.3).
VOID WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv) 
{
// C26481 Don't use pointer arithmetic. Use span instead (bounds.1).
ssh = RegisterServiceCtrlHandlerExW(lpszArgv[0], (LPHANDLER_FUNCTION_EX) Service_Ctrl, 0);
...
}

感谢您的帮助。

这些不是编译器警告,而是代码分析警告(基于CppCoreGuidelines(,它提示如何改进代码以防止常见错误,如空指针取消引用和越界读/写。修复它们可能需要使用gsl工具库:https://github.com/microsoft/GSL.

//C26485表达式"ste":没有指向指针的数组衰减(bounds.3(。StartServiceCtrlDispatcherW(ste(;

这会通知您潜在的危险调用,此函数不获取有关数组大小的信息,因此可能会导致读取缓冲区外的数据。Analyzer不知道此函数依赖于最后一个初始化为null的元素。您可以通过在堆上为ste分配内存并在StartServiceCtrlDispatcherW调用后释放来消除此警告,或者更好的方法是将分配的内存封装在std::unique_ptr中,甚至将条目存储在std::vector

https://learn.microsoft.com/en-us/cpp/code-quality/c26485?view=msvc-170

//C26429符号"lpszArgv"从不测试为null,它可以标记为not_null(f.23(。//C26461函数"ServiceMain"的指针参数"lpszArgv"可以标记为指向const(con.3(的指针。VOID WINAPI ServiceMain(DWORD dwArgc,LPWSTR*lpszArgv(

您应该能够使用gsl:修复此警告

const auto args = gsl::span<LPWSTR>(lpszArgv, dwArgc);

然后使用args,就好像它是lpszArgv一样。有关如何使用gsl的说明,请参阅此处:https://github.com/Microsoft/GSL

根据文档,ServiceMain应始终使用lpszArgv:中的至少一个元素进行调用

。。。第一个参数包含第二个参数中传递给服务的参数数。总会有至少一个争论。第二个参数是指向字符串指针数组的指针。数组中的第一项始终是服务名称。

https://learn.microsoft.com/en-us/windows/win32/services/writing-a-servicemain-function

因此,用抑制此警告应该没问题

#pragma warning(suppress: 26429 26461)
VOID WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv) 

或更好:

[[gsl::suppress(f.23)]]
[[gsl::suppress(con.3)]]
VOID WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv) 

两个警告的链接:https://learn.microsoft.com/en-us/cpp/code-quality/c26429?view=msvc-170https://learn.microsoft.com/en-us/cpp/code-quality/c26461?view=msvc-170

//C26481不要使用指针算术。请改用span(bounds.1(。ssh=RegisterServiceCtrlHandlerExW(lpszArgv[0],(LPHANDLER_FUNCTION_EX(Service_Ctrl,0(;..

如果您使用上面所示的gsl::span,这将被修复

最新更新