我的代碼出現錯誤。代碼可以編譯,但我仍然想擺脫警告。我查看了 stackoverflow 和 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);
...
}
任何幫助表示贊賞。
uj5u.com熱心網友回復:
這些不是編譯器警告,而是代碼分析警告(基于CppCoreGuidelines),它提供了有關如何改進代碼以防止常見錯誤的提示 - 如空指標取消參考和越界讀/寫。修復它們可能需要使用 gsl 工具庫:https : //github.com/microsoft/GSL。
//C26485 運算式“ste”:沒有指向指標衰減的陣列 (bounds.3)。StartServiceCtrlDispatcherW(ste);
這會通知您有關潛在危險的呼叫,此函式不會獲取有關陣列大小的資訊,因此可能會導致讀取緩沖區外的內容。分析器不知道這個函式依賴于最后一個元素被初始化為空。您可以通過ste在堆上分配記憶體并在StartServiceCtrlDispatcherW呼叫后釋放來消除此警告,或者通過將分配的記憶體包裝在內部std::unique_ptr甚至將條目存盤在std::vector
https://docs.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
根據檔案,應該始終使用 lpszArgv 中的至少一個元素呼叫 ServiceMain:
...第一個引數包含在第二個引數中傳遞給服務的引數數量。總會有至少一個論點。第二個引數是一個指向字串指標陣列的指標。陣列中的第一項始終是服務名稱。
https://docs.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 : //docs.microsoft.com/en-us/cpp/code-quality/c26429 ? view = msvc- 170 https://docs.microsoft.com/en-us/cpp/code-質量/c26461?view=msvc-170
// C26481 不要使用指標演算法。改用跨度 (bounds.1)。ssh = RegisterServiceCtrlHandlerExW(lpszArgv[0], (LPHANDLER_FUNCTION_EX) Service_Ctrl, 0); ..
如果您使用 gsl::span 如上所示,這將被修復
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375532.html
