我的代码中出现错误。代码可以编译,但我仍然希望去掉这些警告。我查看了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,这将被修复