So che questa domanda è stato chiesto numerose volte nel SO, ma questa è una variazione dal resto.errore C4996: 'std :: _ Copy_impl': chiamata di funzione con parametri che possono essere pericoloso
Compiler Error: Function call with parameters that may be unsafe
xutility(2227): warning C4996: 'std::_Copy_impl'
mancanza frammento di codice
DWORD dwNumberOfNames = pExportDirectory->NumberOfNames;
LPDWORD dwNames = (LPDWORD)((LPBYTE)hDLL + pExportDirectory->AddressOfNames);
std::vector<std::string> exports;
std::copy(
dwNames,
dwNames + dwNumberOfNames,
[&exports, &hDLL](DWORD dwFuncOffset)
{
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
exports.push_back(fname);
}
);
Errore del compilatore
Errore 1 Errore C4996: 'std :: _ Copy_impl': chiamata di funzione con parametri che possono essere pericolosi - questa chiamata si basa sul chiamante per verificare che i valori passati siano corretti. Per disabilitare questo avviso, utilizzare -D_SCL_SECURE_NO_WARNINGS. Vedere la documentazione su come utilizzare Visual C++ 'A quadri Iteratori' C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include \ xutility 2176
Domanda
Considerando, C4996, significa che la funzione è stata contrassegnata per essere deprecata Dov'è il problema?
- È l'uso di std :: copy, che MS ritiene non sicuro e sarebbe deprecato?
- È perché ho usato
std::copy
con unC Array
? - È a causa del modo in cui utilizzo l'espressione Lambda?
- Se std :: copy è deprecato, qual è l'alternativa, se ho bisogno di essere portatile.
Nota
lo so, come eliminare l'avviso, ma sono curioso di sapere, la causa principale del problema?
Inoltre, altrettanto importante per me sapere, il modo portatile per gestire questo problema senza compromettere la qualità del codice.
Il terzo parametro a std :: copia dovrebbe essere un iteratore di uscita, ma si dispone di un lambda che non restituisce un iteratore. –
(1): con 'std :: copy', non si è sicuri di avere un" posto "sufficiente per output Iterator, quindi c'è un possibile overflow del buffer. – Jarod42
@ Jarod42 Vedere la mia risposta qui sotto, e se si utilizza un 'std :: back_inserter' con un contenitore standard, non si hanno i problemi di overflow. –