Aracılığıyla paylaş


Uyarı C6335

'handlename' işlem bilgileri tutamacını sızıntıya neden oluyor

Açıklamalar

Bu uyarı, CreateProcess işlev ailesi tarafından döndürülen işlem bilgileri tanıtıcılarının CloseHandle kullanılarak kapatılması gerektiğini gösterir. Bunun yapılmaması, tutamaç sızıntılarına neden olur.

Kod analizi adı: LEAKING_PROCESS_HANDLE

Örnek

Aşağıdaki kod bu uyarıyı oluşturur:

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

    // Start the child process.
    if( !CreateProcess( "C:\\WINDOWS\\system32\\calc.exe",
                        NULL,
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,    // Pointer to STARTUPINFO structure.
                        &pi ) ) // Pointer to PROCESS_INFORMATION
  {
    puts("Error");
    return;
  }
  // Wait until child process exits.
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
}

Bu uyarıyı düzeltmek için, aşağıdaki kodda gösterildiği gibi iş parçacığı tutamacını kapatma çağrısı CloseHandle( pi.hThread ) yapın:

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

    // Start the child process.
    if( !CreateProcess( "C:\\WINDOWS\\system32\\calc.exe",
                        NULL,
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,    // Pointer to STARTUPINFO structure.
                        &pi ) ) // Pointer to PROCESS_INFORMATION
    {
      puts("Error");
      return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

Daha fazla bilgi için bkz . CreateProcess İşlevi ve CloseHandle İşlevi.