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