C6298
警告 C6298: 使用唯讀字串 <pointer> 做為可寫入的字串引數: 如此將嘗試寫入靜態唯讀記憶體並造成無預警當機
這項警告表示使用常數字串,做為可能會修改該字串內容之函式的引數。 因為編譯器會將常數字串配置在靜態唯讀記憶體中,所以嘗試修改靜態唯讀記憶體會造成存取違規和無預警當機。
將常數字串儲存在本機陣列中,然後使用此陣列做為函式的引數,即可避免此種情形。
範例
下列範例程式碼會產生這則警告:
#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 );
}