C6298C6298

Advertencia C6298: mediante una cadena de solo lectura <puntero > como un argumento de cadena modificable: Esto intentará escribir en memoria de sólo lectura estático y provocará bloqueos aleatorioswarning C6298: using a read-only string <pointer> as a writable string argument: this will attempt to write into static read-only memory and cause random crashes

Esta advertencia indica que el uso de una constante de cadena como un argumento a una función que puede modificar el contenido de dicha cadena.This warning indicates the use of a constant string as an argument to a function that might modify the contents of that string. Dado que el compilador asigna las cadenas constantes en una memoria de sólo lectura estática, cualquier intento de modificarla provocar infracciones de acceso y bloqueos aleatorios.Because the compiler allocates constant strings in a static read-only memory, any attempts to modify it cause access violations and random crashes.

Esto se puede evitar almacenando la cadena de constante en una matriz local y, a continuación, usando la matriz como argumento a la función.This can be avoided by storing the constant string into a local array and then using the array as the argument to the function.

EjemploExample

El siguiente ejemplo de código genera esta advertencia:The following sample code generates this warning:

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

Para corregir esta advertencia, utilice el siguiente código de ejemplo:To correct this warning, use the following sample code:

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