Предупреждение C6277

Имя приложения NULL с неквотируемым путем при вызове "function-name": приводит к уязвимости безопасности, если путь содержит пробелы

Это предупреждение указывает, что параметр имени приложения имеет значение NULL и может содержать пробелы в имени исполняемого пути.

Замечания

Если имя исполняемого файла не является полным, скорее всего, возникнет проблема с безопасностью. Злоумышленник может вставить исполняемый файл rogue с тем же именем ранее в пути. Чтобы исправить это предупреждение, можно указать имя приложения вместо передачи null. Кроме того, если вы передаете значение NULL для имени приложения, используйте кавычки вокруг пути исполняемого файла.

Имя анализа кода: CREATEPROCESS_ESCAPE

Пример

Следующий пример кода создает предупреждение C6277. Предупреждение вызвано именем приложения NULL и именем исполняемого пути с пробелом. Из-за того, как функция анализирует пробелы, существует риск выполнения другого исполняемого файла. Дополнительные сведения см. в разделе CreateProcessA.

#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 );
}