C6298

تحذير C6298: استخدام سلسلة القراءة فقط <مؤشر> كـ وسيطة سلسلة القابلة للكتابة: هذا سوف يحاول الكتابة إلى ثابت ذاكرة للقراءة فقط و تتسبب في تعطل rوom

هذا التحذير يشير إلى استخدام سلسلة ثابتة كوسيطة دالة التي قد تعديل محتويات هذه السلسلة. نظراً لأن المحول البرمجي بتخصيص سلاسل ثابتة في ثابت ذاكرة للقراءة فقط، أي محاولات إلى تعديل مشكلات خرق الوصول السبب واعطال عشوائية.

يمكن أن تجنب هذا عن طريق sفيring سلسلة الثابت في في صفيفة محلية ومن ثم باستخدام الصفيفة كالوسيطة في الدالة.

مثال

نموذج تعليمات برمجية التالي بإنشاء هذا تحذير:

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