首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在我的C26xxx C++服务代码中获取C++错误

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

Stack Overflow用户
提问于 2021-12-06 14:02:46
回答 1查看 159关注 0票数 0

我的代码出错了。代码会编译,但我仍然希望消除这些警告。我看过堆栈溢出和google,点击了带我到microsoft.com页面的警告,解释了每个警告,但是我没有看到如何消除它们的具体例子。

这是C++代码和警告。

代码语言:javascript
运行
复制
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);
...

}

任何帮助都是非常感谢的。

EN

Stack Overflow用户

回答已采纳

发布于 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修复此警告:

代码语言:javascript
运行
复制
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

因此,可以通过以下方式来压制这一警告:

代码语言:javascript
运行
复制
#pragma warning(suppress: 26429 26461)
VOID WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv) 

或更好:

代码语言:javascript
运行
复制
[[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,这将得到修正,如上面所示

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70246716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档