c - 无法摆脱夹板警告“定义前使用的字段”,“使用的右值在某些执行时可能未初始化为值”
问题描述
我正在努力摆脱以下代码的夹板警告:
void GetPrinterInfo(HANDLE hPrinter){
PRINTER_INFO_4* pPrinterInfo = NULL;
DWORD bytesNeeded;
GetPrinter(hPrinter, 4, NULL, 0, &bytesNeeded);
pPrinterInfo = malloc(bytesNeeded);
if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){
printf("Printer name: %S", pPrinterInfo->pPrinterName);
}
free(pPrinterInfo);
}
警告是(在“printf”行):
定义前使用的字段 pPrinterInfo->pPrinterName
1> 使用的右值在某些执行时可能未初始化为值
大概它假设pPrinter
尚未填充。我试过SetPrinter
用/*@out@*/
s 等标记标题定义,但它没有帮助。我在头文件中尝试了一堆注释,例如/*@temp@*/
,/*@dependent@*/
无济于事。
我如何明智地让夹板知道 pPrinter 字段在调用后应该是有效的GetPrinter
?
解决方案
SetPrinter
目前尚不清楚为什么out
注释不起作用。然而,一个可接受的解决方法(来自 user3386109)是只清空内存,以便夹板将其视为已初始化:
pPrinterInfo = malloc(bytesNeeded);
ZeroMemory(pPrinterInfo, bytesNeeded);
if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){
WhereZeroMemory
只是memset
.
这并不理想,如果不采取额外措施来解决此警告会更好,但它适用于我的情况。
推荐阅读
- haskell - 常数空间短路`foldM`超过`Maybe`
- flutter - 如果文档不存在,Flutter Firestore 设置文档
- stm32 - STM32F103C8 几个小时后复位
- angular - 如何在 Angular 11 中按字母顺序排序?
- r - 如何在r中保存具有不同标题的RDS文件?
- rust - Rust 宏:将参数匹配为闭包,但区分非闭包表达式和闭包表达式
- next.js - 尝试使用 Nextjs 启用 Google AMP 但获取标签错误的父标签
- javascript - 如何在js中从css中列出@font-face
- react-native - 如何在 Expo-av 中同步播放多个音频文件?
- reactjs - 我的 Reactjs 程序不断执行 useEffect 挂钩,而我希望它只执行一次