You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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语句末尾缺少分号),导致静态分析工具仍报错。

正确修复需同时满足两点:

  1. 修正语法错误
  2. 严格遵循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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:17:37