2010-05-11 3 views
4

즉 -char 포인터 버퍼 오버플로를 방지하려면 어떻게합니까?

int function(char* txt) 
{ 
    sprintf(txt, "select * from %s;", table); 
    //How do I set last char in buffer to NULL here? 
} 

그렇다면 테이블의 텍스트 몇 가지 방법 500 개 문자 주요 길고 TXT은 .... 100로

감사를 정의 하였다.

+11

테이블의 텍스트가 바둑판 형태가 아니길 바랍니다. –

+3

NUL은 '\ 0'문자이고, NULL은 초기화되지 않은 포인터입니다. – detly

답변

11

당신은 snprintf()의 반환 값은 버퍼가 필요 얼마나 큰 볼 수 snprintf() 대신 체크

  • sprintf()의 버퍼
  • 사용의 크기를 제공하는 함수에 매개 변수를 추가

    • 필요 형식화 된 모든 데이터를 보유하는 것; 이 값이 버퍼의 크기보다 크거나 같으면 적절하게 처리해야합니다 (버퍼는 여전히 null로 끝나지 만 내용은 잘려 지거나 잘리는가 오류인지 완전히 다릅니다). 귀하의 사용의 경우)

    (당신의 함수는 반환 형식이 필요합니다 ...)

  • +0

    감사합니다. 다른 방법이 있는지 확실하지 않았습니다. –

    3

    에 당신은 사용되는 버퍼의 양을 제한하기 위해 현재 snprintf를 사용할 수 있어야합니다.

    function(char* txt, size_t length) 
    { 
        int rv; 
        rv = snprintf(txt, length, "select * from %s;", table); 
        //How do I set last char in buffer to NULL here? 
        if (rv >= length) { 
         // error 
        } 
    } 
    
    +1

    'snprintf()'의 반환 값을 검사 할 필요가 있습니다 만, 처리해야 할 오류가있는 경우에는 - truncation이 필요합니다. – caf

    +0

    @caf 감사합니다. 업데이트되었습니다. – WhirlWind

    0

    당신이 할 수있는 일은 malloc만큼의 메모리뿐입니다. 메모리에 문자열을 포맷하고 포인터를 반환하십시오. 그런 다음 호출 함수는 메모리 사용을 끝내면 메모리를 해제해야합니다.

    +0

    그 이상을 할 수 있습니다. – WhirlWind

    관련 문제