2010-02-23 22 views
7

Recibo una advertencia cuando uso la función de copia estándar.Problema al utilizar std :: copy

Tengo una matriz byte que declaro.

byte *tstArray = new byte[length]; 

entonces tengo un par de otras matrices de bytes que se declaran e inicializan con unos valores hex que me gustaría utilizar en función de una cierta entrada de usuario inicial.

Tengo una serie de sentencias if que utilizo básicamente para analizar la entrada original, y en base a alguna cadena, elijo qué matriz de bytes usar y al hacerlo copio los resultados al tstArray original.

Por ejemplo:

if(substr1 == "15") 
{ 
    std::cout<<"Using byte array rated 15"<<std::endl; 
    std::copy(ratedArray15,ratedArray15+length,tstArray); 
} 

La advertencia que consigo es C4996 advertencia: 'std :: copia': llamada a función con parámetros que pueden ser inseguros - esta llamada se basa en la persona que llama para comprobar que los valores pasados ​​ son correctos.

Una posible solución es desactivar esta advertencia usando -D_SCL_SECURE_NO_WARNINGS, creo. Bueno, eso es lo que estoy investigando.

Pero, no estoy seguro de si esto significa que mi código es realmente inseguro y realmente necesitaba hacer algunas comprobaciones?

+0

parece que no puede obtener el código para enviar ... por ejemplo si (substr1 == "15") { std :: cout << "Uso de matriz de bytes nominal de 15" << std :: endl ; std :: copy (ratedArray15, ratedArray15 + length, tstArray); } – djones2010

+0

Lo arreglé por ti. Para publicar el código, solo sangría cuatro espacios y coloque una nueva línea antes y después del bloque de código. Además, hay un botón en el editor que puede usar para hacer eso automáticamente. –

+0

Significa que hizo muchas preguntas, pero solo hizo clic en la marca de verificación para aceptar una respuesta como "correcta" en el 11% de las preguntas que hizo. –

Respuesta

9

C4996 significa que está utilizando una función que se marcó como __declspec(deprecated). Probablemente usar D_SCL_SECURE_NO_WARNINGS simplemente #ifdef la depreciación. Podrías leer el archivo de cabecera para estar seguro.

Pero la pregunta es ¿por qué está obsoleto? MSDN no parece decir nada al respecto en la página std :: copy(), pero podría estar buscando uno equivocado. Por lo general, esto se hizo para todas las "funciones de manipulación de cadenas inseguras" durante la gran presión de seguridad de XPSP2. Como no está pasando la longitud de su búfer de destino a std :: copy, si intenta escribir demasiados datos, felizmente escribirá más allá del final del búfer.

Decir si su uso no es seguro requerirá que revisemos su código completo. Por lo general, hay una versión más segura que recomiendan cuando anulan una función de esta manera. Podrías simplemente copiar las cuerdas de alguna otra manera. This article parece ir en profundidad. Parecen implicar que deberías estar usando un std :: checked_array_iterator en lugar de un OutputIterator regular.

Algo así como:

stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length); 
std::copy(ratedArray15, ratedArray15+length, chkd_test_array); 

(. Si entiendo su código derecha)

+5

'checked_array_iterator' no es estándar, sin embargo. – UncleBens

+1

Sí, stdext no es una tierra divertida para jugar. Sin embargo, la desaprobación tampoco es estándar. Personalmente, nunca tuve la necesidad de usar std :: copy() para matrices de caracteres; Prefiero usar StringCchCopy(), aunque también es específico de Microsoft. En el código portátil escribiría un contenedor que usa strncpy() en plataformas que no son MSFT. –

+0

esto fue de lo más útil. Lo único que me tiene un poco desconcertado es que cuando voy a http://msdn.microsoft.com/en-us/library/aa985928(VS.80).aspx y para la duración, uso _count (array_name) entonces recibo un error que dice Error del compilador C2784 'declaration': no ​​se pudo deducir argumento de plantilla para 'tipo' de 'tipo' El compilador no puede determinar un argumento de plantilla a partir de los argumentos de la función suministrada. pero cuando uso el tamaño de matriz exacto que en este caso sí sé, funciona bien. ¿algunas ideas? aparte de eso, fue de lo más útil. – djones2010

4

Básicamente, lo que esta advertencia le dice es que tiene que estar absolutamente seguro de que tstArray apunta a una matriz que es lo suficientemente grande como para contener elementos de "longitud", ya que std::copy no lo comprueba.

1

Bueno, supongo desaprobación unilateral de Microsoft de la stdlib también incluye pasar char*-std::copy. (Han enredado con toda una gama de funciones en realidad.)

Supongo que algunas partes tienen algún mérito (fopen() toca global ERRNO, por lo que no es seguro para subprocesos) pero otras decisiones no parecen muy racionales.(Diría que tomaron una franja demasiado grande en todo el asunto. Debería haber niveles, como los que no son seguros para roscar, no verificables, etc.)

Recomendaría leer el MS-doc en cada función si sin embargo, desea saber los problemas de cada caso, está bastante bien documentado por qué cada función tiene esa advertencia, y la causa suele ser diferente en cada caso.

-1

Al menos parece que VC++ 2010 RC no emite esa advertencia en el nivel de advertencia predeterminado.

+0

Ignorar la advertencia no es una solución. Como mínimo, debe comprender por qué ocurre la advertencia antes de decidir ignorarla. –

+1

No lo estoy ignorando, simplemente digo que VC++ 2010 RC ya no lo emite. –

Cuestiones relacionadas