2010-12-12 7 views
0

오버 플로우 수 내 C++ 프로그램에서 C 함수를 포함 할 필요가, g로 코드를 컴파일 할 때 ++ 나는 다음과 같은 경고 얻을 :그램 + + + 함수 역시 : 대상 버퍼를

In function ‘char* strncat(char*, const char*, size_t)’, 
    inlined from ‘int get_usage(pid_t, pstat*)’ at src/getusage.c:24: 
/usr/include/bits/string3.h:154: warning: call to 
char* __builtin___strncat_chk(char*, const char*, long unsigned int, 
long unsigned int) might overflow destination buffer 

코드 :

int pidof(const char* process_name){ 
char cmd[50] ="pidof "; 
strncat(cmd, process_name, sizeof(cmd) - strlen(cmd) -1); 
[..] 

이 경고는 어떻게 제거합니까?

+0

Welcome to StackOverflow! FAQ 주위를 둘러보십시오 : http://stackoverflow.com/faq –

+0

ouh, stupid mistake :) 오류 메시지를 잘못 읽었습니다. 오류가 다른 매개 변수를 사용하여 다른 크기의 매개 변수로만 버퍼 크기를 전달했습니다. :) – fho

+0

std :: string을 사용해야합니다. 사용하기가 더 쉽습니다. 연결에 대한 지원이 내장되어 있으며 사용하기에 더 안전합니다. – bruno

답변

1

코드는 (내가 생각하는) 안전하지만, 당신의 길이를 알고있는 경우 strncat() 기능을 사용하는 경우에만 안전 :

  1. 버퍼를
  2. 버퍼에 이미 재료

추가 할 머티리얼의 길이를 알고 있고 사용할 수있는 공간보다 짧으면 memmove()을 사용하면됩니다. 그것이 더 길면, 당신이 그것을 자르고 있다고보고해야합니까? 추가 할 머티리얼의 길이를 모르는 경우 어쩌면해야합니다 (무언가를 잘라낼 수 있다고보고 할 수는 있지만). 불편하면 memmove()을 사용하고 마지막에 null을 추가 할 수 있습니다. null 종료를 보증하는 버퍼 코멘트에서

1

게시 :

오류가 난 단지

strlcat() 고정 된 크기 매개 변수 =로 버퍼의 크기를> 통과 어디 다른 함수 역시 사용에 있었에 더 간단한 인터페이스를 제공 이 유형의 오류 (버퍼에 이미있는 문자열의 길이를 고려하지 않은 것을 잊어 버림)를 방지하도록 설계된 연결 유형입니다.

툴체인이 없으면 OpenBSD 버전은 꽤 자유로운 라이센스를 가지고 있으며 어떤 이유로 든 통합 할 수없는 경우 구현하기가 매우 간단한 기능입니다. 당신이이 길을 가면 경계 조건). 이 작업을 한 번 수행하면 부적절한 사용으로 인한 버그를 영구적으로 방지 할 수 있습니다. strncat()strlcat()의 부적절한 사용으로 인해 실행될 수있는 버그 유형은 덜 심각 할 수 있습니다 (잘라내기를 확인하는 것을 잊지 않는 것은 보통 버퍼 오버런보다 문제가 적습니다).