2015-01-15 4 views
0
#include <string> 
#include <stdarg.h> 
#include <stdio.h> 
#include <memory> 

void kekeTrace(const char* format, ...) 
{ 
    char buff[1000] = { 0 }; 
    va_list argList; 
    va_start(argList, format); 
    vsnprintf(buff, 1000, format, argList); 
    va_end(argList); 
} 

int main() 
{ 
    std::shared_ptr<int> obj(new int(3)); 
    kekeTrace("%x,%d,%s\n", obj, 1, "w"); //crash 
    kekeTrace("%x,%s\n", obj, "w"); // do not crash 
    return 0; 
} 

kekeTrace에 대한 첫 번째 호출은 중단되지만 두 번째 호출은 중단됩니다. 왜?Visual Studio 2013/2015에서 vsnprintf 충돌이 발생하는 이유는 무엇입니까?

+1

정의되지 않은 동작입니까? 그것을 역 참조해야합니다,'obj'. – Dialecticus

답변

2

두 줄 모두 정의되지 않았으므로 둘 다 충돌 할 수도 있고 충돌하지 않을 수도 있으며, 출력 할 수도 있고하지 않을 수도 있습니다.

요즘 컴파일러는 printf 등의 형식 문자열에서 지원되지 않는 유형에 대해 경고하기에 충분히 똑똑하지만 자신 만의 함수를 호출하기 때문에 컴파일러는 사용자가 어떤 작업을 수행 할 것인지 전혀 모릅니다.

기본 포인터를 전달해야합니다 (obj.get()).

관련 문제