C6298
Aviso C6298: usando uma seqüência de somente leitura <pointer> como um argumento de seqüência de caracteres gravável: Isso irá tentar gravar em estática memória somente 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 seqüência. 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 por armazenar 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 );
}