C6298
Обновлен: Ноябрь 2007
C6298
Предупреждение C6298. Использование строки <указатель>, доступной только для чтения, в качестве изменяемого строкового аргумента. Это приведет к попытке записи в статическую память только для чтения и случайным сбоям
Данное предупреждение указывает на использование строковой константы в качестве аргумента функции, которая может изменить содержимое строки. Поскольку компилятор выделяет для строковых констант статическую память, доступную только для чтения, любые попытки изменения приведут к нарушениям доступа и случайным сбоям.
Этого можно избежать, сохранив строковую константу в локальном массиве, а затем используя данный массив в качестве аргумента функции.
Пример
Это предупреждение создается в следующем примере кода:
#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 );
}
Для устранения этого предупреждения используйте следующий пример кода:
#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 );
}