Поделиться через


C6277

Предупреждение C6277: имя приложения 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 );
}