C6298
Ostrzeżenie C6298: za pomocą ciągu <pointer> tylko do odczytu jako argument ciąg zapisywalny: spowoduje to próbę zapisu w statycznej pamięci tylko do odczytu i losową awarię
To ostrzeżenie wskazuje użycie stały ciąg jako argument do funkcji, która może zmodyfikować zawartość danego ciągu znaków.Ponieważ kompilator przydziela stałe ciągi w statycznej pamięci tylko do odczytu, wszelkie próby modyfikacji powodować naruszeń dostępu i przypadkowym awariom.
Można to uniknąć przechowywania stały ciąg do lokalnej tablicy, a następnie korzystając tablicy jako argument do funkcji.
Przykład
Następujący przykładowy kod generuje ostrzeżenie to:
#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 );
}
Aby poprawić to ostrzeżenie, należy użyć następującego kodu próbki:
#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 );
}