C6277

警告 C6277:在对 <function> 的调用中使用的 NULL 应用程序名含未加引号的路径: 如果路径中包含空格将导致安全漏洞

此警告意味着应用程序名参数为 null,而且可执行文件的路径名中可能包含空格。 在这种情况下,除非可执行文件的名称是“完全限定的”,否则可能导致安全问题。 恶意用户可能在该路径中插入同名的欺诈性可执行文件。 若要更正此警告,可以指定应用程序名,而不是传递 null。如果您的确要为该应用程序名传递 null,请在可执行文件的路径两侧加上引号。

示例

在下面的代码示例中,由于应用程序名参数为 null,而且可执行文件的路径名中有一个空格,因此生成此警告;函数分析空格的方法可能导致运行一个不同的可执行文件的风险。 有关更多信息,请参见 CreateProcess

#include <windows.h>
#include <stdio.h>

void f_defective()
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );
    if( !CreateProcessA( NULL,
                        "C:\\Program Files\\MyApp",
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,
                        &pi ) ) 
    {
        puts( "CreateProcess failed." ); 
        return;
    }
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

若要更正此警告,请在可执行文件的路径两侧加上引号,如下面的示例所示:

#include <windows.h>
#include <stdio.h>

void f ()
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );

    if( !CreateProcessA( NULL,
                        "\"C:\\Program Files\\MyApp.exe\"",
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,
                        &pi ) ) 
    {
        puts( "CreateProcess failed." ); 
        return;
    }
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}