Compartir a través de


C6298

Actualización: noviembre 2007

C6298

Advertencia C6298: Argumento <puntero>: se utiliza una cadena de sólo lectura como argumento de cadena modificable. Se intentará escribir en la memoria estática de sólo lectura y provocará bloqueos aleatorios

Esta advertencia indica que se ha utilizado una cadena constante como argumento de una función que podría modificar el contenido de esa cadena. Dado que el compilador asigna las cadenas constantes en una memoria de sólo lectura estática, cualquier intento de modificación puede provocar infracciones de acceso no permitido y bloqueos aleatorios.

Esto se puede evitar almacenando la cadena constante en una matriz local y utilizando la matriz como argumento de la función.

Ejemplo

El siguiente ejemplo de código genera esta advertencia:

#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:

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