[VS2010] warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
카테고리 없음 2012. 12. 3. 19:01warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
내용은 strcpy 함수는 안전하지 않습니다. 대신 strcpy_s를 사용 하십시오.
이해
예전의 문자열 함수들은 버퍼 오버플로우가 발생할 수 있는 버그 요소를 안고 있습니다. 물론 잘 사용하면 문제되지 않지만 프로그램에 심각한 버그를 초래할 수 있는 여지가 있습니다.
아래의 코드를 보면서 설명 드리겠습니다.
bad 는 3바이트 짜리인데 strcpy로 NULL 바이트 포함해서 7바이트가 bad 변수에 strcpy 함수로 복사를 시도 하고 있습니다. 즉 할당 받은 곳을 넘어서 다른 메모리까지 침범하였지만 bad 변수의 값을 확인해보면 사용자가 의도한(?) 그대로 "123456" 이란 값이 들어가 있는것을 볼수 있습니다.
하지만 결과론적으로는 3바이트 변수에 7바이트를 덮어 씌웠으니 사용해서는 안될 4바이트를 사용한 것 입니다. 만약 이대로 계속 프로그램이 실행된다면 어디에서 문제가 발생할지 알 수 없습니다. 우연히 문제가 발생되지 않을 수도 있습니다. 그래서 더욱 위험합니다.
그렇다면 빌드시의 warning에서 알려준대로 strcpy 대신 strcpy_s를 사용해 보겠습니다. 무슨 차이가 있는지 아래 코드를 보도록 하겠습니다.
3바이트짜리 변수에 7바이트를 입력하려 했더니 바로 assert 창이 뜨면서 프로그램이 종료됩니다. 3바이트 짜리에 7바이트를 복사하려 하니 버퍼가 너무 작다며 예외 처리를 합니다. 이처럼 문제가 발생했을 때 바로 인지할 수 있도록 하여서 버그의 소지가 있는 곳을 바로 알수 있게 됩니다.
즉 문제가 있는 코드를 지나서 한참 뒤에서 문제가 발생하면 그 원인을 찾기가 힘들지만 이처럼 바로 예외가 발생하면 찾기가 수월합니다.
대부분의 문자열 함수에 _s가 붙은 경우 이런 의도라고 보시면 됩니다.