Condividi tramite


C6298

Aggiornamento: novembre 2007

C6298

avviso C6298: argomento <puntatore>: utilizzo di una stringa in sola lettura come argomento stringa non protetto da scrittura. Questa condizione condurrà a tentativi di scrittura nella memoria statica in sola lettura e provocherà arresti anomali casuali del sistema

L'avviso indica l'utilizzo di una stringa costante come argomento di una funzione che potrebbe modificare il contenuto della stringa. Dal momento che il compilatore alloca stringhe costanti in una memoria statica di sola lettura, qualsiasi tentativo di modifica provocherà violazioni dell'accesso e arresti anomali del sistema.

Per evitare che ciò accada, archiviare la stringa costante in una matrice locale e quindi utilizzare tale matrice come argomento della funzione.

Esempio

Il codice di esempio seguente genera questo avviso:

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

Per risolvere il problema, utilizzare il codice di esempio seguente:

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