C6298

avertissement C6298 : utilisation d'une chaîne <pointeur> en lecture seule comme argument de chaîne accessible en écriture. Cette opération peut inciter à des tentatives d'écriture dans la mémoire statique en lecture seule et provoquer des pannes aléatoires

Cet avertissement indique l'utilisation d'une chaîne constante comme argument d'une fonction qui peut modifier le contenu de cette chaîne.Étant donné que le compilateur alloue des chaînes constantes dans une mémoire statique en lecture seule, toute tentative de modification provoque des violations d'accès et des pannes aléatoires.

Cette situation peut être évitée en stockant la chaîne constante dans un tableau local, puis en utilisant le tableau comme argument de la fonction.

Exemple

L'exemple de code suivant génère cet avertissement :

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

void f()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );
    if( !CreateProcess(NULL,
                      "\"c:\\Windows\\system32\\calc.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 );
}

Pour corriger cet avertissement, utilisez l'exemple de code suivant :

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

void f( )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    
    char szCmdLine[] = "\"c:\\Windows\\system32\\calc.exe\"";
    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );

    if( !CreateProcess(NULL,
                      szCmdLine,
                      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 );
}