C++ uninitialized local variable

前端 未结 5 673
夕颜
夕颜 2020-11-27 23:41

I have a function:

VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
{
    OSVERSIONINFO osver;
    ZeroMemory(&osver, sizeof(OSVERSIONINFO));
         


        
5条回答
  •  遥遥无期
    2020-11-28 00:30

    the problem is there:

    DWORD major;
    DWORD minor;
    DWORD build;
    GetOSVersion(&major, &minor, &build);
    

    Fix:

    VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
    {
        OSVERSIONINFO osver = {};
        osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&osver);
        if(major)
        *major = osver.dwMajorVersion;
        if(minor)
        *minor = osver.dwMinorVersion;
        if(build)
        *build = osver.dwBuildNumber;
    }
    
    DWORD major = 0;
    DWORD minor = 0;
    DWORD build = 0;
    GetOSVersion(&major, &minor, &build);
    

    PDWORD is pointer to DWORD. All three parameters are output parameters. In C/C++, it's a common usage: if you want to return more then one value from a function, you need pass pointer (or reference too in case of c++) to a variable:

    int var = 0;
    if(some_function_that_can_fail_and_write_result(&var))
     ;//do something
    

    In your case you are passing uninitialized pointer to a function by value. It's the same as:

    void foo(int parameter);
    // ...
    int a;
    foo(a);
    

    You have a lot of ways:

    Pass uninitialized pointer by reference:

    VOID GetOSVersion(PDWORD& major, PDWORD&, PDWORD&)
    {
    //...
    major = new DWORD(osver.dwMajorVersion);
    
    }
    // usage:
    PDWORD major;
    GetOSVersion(major, ....);
    
    //...
    delete major;
    

    Pass all parameters by reference:

    VOID GetOSVersion(DWORD& major, DWORD&, DWORD&)
    {
    //...
    major = osver.dwMajorVersion;
    
    }
    // usage:
    DWORD major = 0;
    GetOSVersion(major, ....);
    

    Use your version of GetOSVersion(), but with the fix in this answer on the beginning

提交回复
热议问题