Partager via


C6277

avertissement C6277 : nom d'application NULL avec chemin sans guillemets dans l'appel à <fonction> : un chemin contenant des espaces peut provoquer une faille de sécurité

Cet avertissement indique que le paramètre de nom d'application est null et que le chemin d'accès de l'exécutable contient peut-être des espaces.Dans ce cas, à moins que le nom exécutable ne soit "qualifié complet", il y a probablement un problème de sécurité.Un utilisateur malveillant peut insérer un exécutable non autorisé portant le même nom en amont dans le chemin d'accès.Pour corriger cet avertissement, vous pouvez spécifier le nom d'application au lieu de passer une valeur null ou si vous passez une valeur null pour le nom d'application, spécifiez le chemin d'accès de l'exécutable entre guillemets.

Exemple

L'exemple de code suivant génère cet avertissement parce que le paramètre de nom d'application est null et que le chemin d'accès de l'exécutable contient un espace ; en effet, un fichier exécutable différent risque de s'exécuter à cause de la manière dont la fonction analyse les espaces.Pour plus d'informations, consultez 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 );
}

Pour corriger cet avertissement, placez le chemin d'accès de l'exécutable entre guillemets, comme le montre l'exemple suivant :

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