Udostępnij za pośrednictwem


C6298

Ostrzeżenie C6298: za pomocą ciągu <pointer> tylko do odczytu jako argument ciąg zapisywalny: spowoduje to próbę zapisu w statycznej pamięci tylko do odczytu i losową awarię

To ostrzeżenie wskazuje użycie stały ciąg jako argument do funkcji, która może zmodyfikować zawartość danego ciągu znaków.Ponieważ kompilator przydziela stałe ciągi w statycznej pamięci tylko do odczytu, wszelkie próby modyfikacji powodować naruszeń dostępu i przypadkowym awariom.

Można to uniknąć przechowywania stały ciąg do lokalnej tablicy, a następnie korzystając tablicy jako argument do funkcji.

Przykład

Następujący przykładowy kod generuje ostrzeżenie to:

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

Aby poprawić to ostrzeżenie, należy użyć następującego kodu próbki:

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