Share via


C6298

업데이트: 2007년 11월

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