我的代码出错了。代码会编译,但我仍然希望消除这些警告。我看过堆栈溢出和google,点击了带我到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);
...
}
任何帮助都是非常感谢的。
发布于 2021-12-06 16:58:03
这些不是编译器警告,而是代码分析警告(基于CppCoreGuidelines),它们提供了一些提示,说明如何改进代码以防止常见错误--如空指针取消引用和超出绑定读/写。修复它们可能需要使用工具的gsl库:https://github.com/microsoft/GSL。
//C 26485表达式'ste':没有指向指针衰减的数组(界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‘从未被测试为空,它可以标记为not_null (f.23)。// C26461函数'ServiceMain‘的指针参数'lpszArgv’可以标记为指向const (con.3)的指针。无效WINAPI ServiceMain(DWORD dwArgc,LPWSTR* lpszArgv)
您应该能够用gsl修复此警告:
const auto args = gsl::span<LPWSTR>(lpszArgv, dwArgc);
然后像使用lpszArgv一样使用args。有关如何使用gsl的说明,请参阅此处:https://github.com/Microsoft/GSL
根据文档,应该始终使用至少一个元素在ServiceMain中调用lpszArgv:
...The第一个参数包含在第二个参数中传递给服务的参数数。至少总会有一个论点。第二个参数是指向字符串指针数组的指针。数组中的第一项始终是服务名称。
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-170 https://learn.microsoft.com/en-us/cpp/code-quality/c26461?view=msvc-170
// C26481不要使用指针算法。使用span代替(界1)。RegisterServiceCtrlHandlerExW(lpszArgv,(LPHANDLER_FUNCTION_EX) Service_Ctrl,0);
如果您使用gsl::span,这将得到修正,如上面所示
https://stackoverflow.com/questions/70246716
复制相似问题