Freigeben über


C6298

C6298

Warnung C6298: Verwendung einer schreibgeschützten <Zeiger>-Zeichenfolge als schreibbares Zeichenfolgenargument: Dieses wird einen Schreibversuch im statischen, schreibgeschützten Speicher vornehmen und unvorhersehbare Abstürze verursachen.

Diese Warnung deutet auf die Verwendung einer Konstantenzeichenfolge als Argument für eine Funktion hin, die möglicherweise den Inhalt dieser Zeichnfolge ändert. Da der Compiler Konstantenzeichenfolgen in einem statischen, schreibgeschützten Speicher zuordnet, führen Änderungen zu Zugriffsverletzungen und unvorhersehbaren Abstürzen.

Dies kann vermieden werden, indem die Konstantenzeichenfolge in einem lokalen Array gespeichert und dann das Array als Argument für die Funktion verwendet wird.

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert:

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

So korrigieren Sie die Warnung unter Verwendung des folgenden Beispielcodes

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