Поделиться через


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