如何修复VirtualFreeEx引发的C28160错误注释警告?
修复C28160警告:VirtualMemFree函数的参数问题
我的MemoryApi::VirtualMemFree函数触发了多个C28160(错误注解类型)警告,原始代码如下:
BOOL MemoryApi::VirtualMemFree(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) const { return ::VirtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType); }
我尝试按文档建议修改代码,但警告仍未消除,修改后的代码如下:
BOOL MemoryApi::VirtualMemFree(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) const { if (dwFreeType == MEM_RELEASE) return ::VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE) return ::VirtualFreeEx(hProcess, lpAddress, 0, dwFreeType); }
问题原因与修复方案
C28160警告的核心是VirtualFreeEx的参数不符合系统API要求,加上修改后的代码存在语法错误(第一个return语句末尾缺少分号),导致静态分析工具仍报错。
正确修复需同时满足两点:
- 修正语法错误
- 严格遵循
VirtualFreeEx的参数规则:- 当
dwFreeType为MEM_RELEASE时,dwSize必须传入0,且lpAddress必须是VirtualAllocEx返回的起始地址 - 当
dwFreeType为MEM_DECOMMIT时,dwSize可指定释放大小(或传0表示释放整个已提交区域)
- 当
修正后的完整代码:
BOOL MemoryApi::VirtualMemFree(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) const { if (dwFreeType == MEM_RELEASE) { // MEM_RELEASE模式下必须传入0作为dwSize return ::VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE); } // MEM_DECOMMIT模式保留原dwSize参数(允许传0释放整个区域) return ::VirtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType); }
额外说明:
- 函数的
const修饰符合理,因为该函数仅调用系统API,未修改类成员变量 - 若静态分析工具仍有其他警告,可检查
hProcess、lpAddress的有效性,必要时添加_In_、_Pre_notnull_等注解,但这不是触发C28160的直接原因
内容的提问来源于stack exchange,提问作者Stew
相关产品推荐
相关产品推荐

