올바른 인수를 사용하여 snprintf
으로 전화를 걸 수없는 경우 snprintf
에 대해 sprintf
을 변경하면 도움이되지 않습니다. foo
함수는 snprintf
처럼 sprintf
이상의 추가 매개 변수가 필요한 추가 매개 변수를 가져와야합니다. 배열은 함수에 대한 인수로 사용될 때 포인터로 감쇠되므로 모든 크기 정보가 손실됩니다.
프로그램 전체에서 수 백 번 foo
을 호출하는 경우 엉망이 될 수 있지만 버퍼 오버런을 방지하려면 배열에서 작동하는 모든 함수가 완전히 인식되는지 확인해야합니다 그들의 크기. 당신이 GCC 또는 연타를 사용하는 경우
, 당신은 1에 프로토 타입을 변경하여 foo
기능에 대한 사용 중단 경고를 넣을 수 있습니다 :
void __attribute__((deprecated)) foo(char *a, uchar *string);
그런 다음, 예를 새로운 기능을 만들 수 있습니다 foo_n
에는 크기에 대한 추가 매개 변수가 있습니다. 코드를 컴파일 할 때, GCC는 함수 foo
을 사용할 때마다 경고를 내고, foo_n
으로 바꾼다.
1.이 __attribute__((deprecated))
부분은 후 매개 변수 목록을 을가는 것이 가능하지만 그 소리는 위에 표시된대로 그것을 받아 들일 것으로 보인다.
버퍼 크기를 함수에 전달해야합니다. – Kevin
'int len = snprintf (NULL, 0, ....)'을 호출하면,'char buf [len]; snprintf (buf, len, ....);'적어도'buf'는 완전한 문자열을 가지고 있습니다. 얼마나 많은 것이'문자열 '에 들어 맞는지에 관해서 - 당신은 당신 자신에 달려 있습니다. – chux
함수에 새로운 크기 매개 변수를 추가하는 것 외에도 포인터와 버퍼 크기를 보유하는'struct ustring'을 만드는 것입니다. 만약 당신이 좋아하면 struct에 문자열 크기를 추가 할 수 있습니다.이 함수는'strcpy' 대신에'memcpy'와 같은 더 빠른 함수를 사용할 수 있도록합니다. –