Partilhar via


C6298

Aviso C6298: usando uma seqüência de somente leitura <pointer> como um argumento de seqüência de caracteres gravável: tentará gravar no estática memória somente para leitura e causar falhas aleatórias

Este aviso indica que o uso de uma seqüência de caracteres constante como um argumento para uma função que pode modificar o conteúdo dessa cadeia de caracteres.Como o compilador aloca seqüências de caracteres constantes em uma estática memória somente leitura, qualquer tentativa de modificá-lo causa violações de acesso e falhas aleatórias.

Isso pode ser evitado, armazenando a seqüência de caracteres constante em uma matriz local e, em seguida, usando a matriz como argumento para a função.

Exemplo

O exemplo de código a seguir gera este aviso:

#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 corrigir esse aviso, use o exemplo de código a seguir:

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