C6298C6298

Advertencia C6298: mediante una cadena de solo lectura <puntero > como un argumento de cadena modificable: Esto se intentará escribir en la memoria estática de solo lectura 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 cadena constante como argumento a una función que puede modificar el contenido de esa 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 cadenas constantes en una memoria de sólo lectura estática, cualquier intento para modificarlo, 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 almacenar la cadena de constante en una matriz local y, a continuación, utilizando 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 );
}