문제

나는 기능을 사용하고있다 gets() 내 C 코드에서. 내 코드는 잘 작동하지만 경고 메시지가 있습니다.

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.

이 경고 메시지가 나타나지 않기를 바랍니다. 어떤 방법이 있습니까?

일부 경고를 비활성화하기위한 헤더 파일을 만들어 그러한 가능성이 있을지 궁금합니다. 아니면 컴파일하는 동안 내 목적을 달성 할 수있는 옵션이 있습니까? 또는 특정 사용 방법이있을 수 있습니다. gets() 이 경고가 나타나지 않으려면?

도움이 되었습니까?

해결책

명백한 대답은 컴파일러가 당신에게 말하려고하는 것을 배우는 것입니다. 당신은 완전히 안전하지 않기 때문에 gets ()를 사용해서는 안됩니다. 사용 fgets () 대신 가능한 버퍼 오버런을 방지 할 수 있습니다.

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe

다른 팁

당신이 정말로 그것을 사용하고 싶다면.

다음은 다음과 같습니다. http://www.gamedev.net/community/forums/topic.asp?topic_id=523641

합리적으로 최근의 GCC 버전을 사용하는 경우 다음을 사용할 수 있습니다.

#pragma GCC diagnostic ignored "your option here"

예를 들어, 해당 헤더가 "플로팅 포인트 비교가 안전하지 않은"오류를 생성하는 경우 다음을 사용할 것입니다.

#pragma GCC diagnostic ignored "-Wfloat-equal".

운이 좋지 않게, 당신은 "-wall"을 비활성화 할 수 없습니다 (너무 쉬울 것입니다 ... 그렇지 않을 것입니다 ...), 당신은 -wall이 손으로 가능하게하는 개별 경고 옵션을 수행해야합니다 (적어도 충돌하는 것).

문서 : http://gcc.gnu.org/onlinedocs/gcc/diagnostic-pragmas.html#diagnostic -pragmas

편집하다: 그러나 경고를받는 것은 효과가없는 것 같습니다 ... 나는 PC에서 시도했습니다.

나는 경고에주의를 기울이고 교체 할 것이다 gets. 이것은 나에게 충분히 분명하다 :

버그

gets ()를 사용하지 마십시오. 데이터를 미리 알지 못하고 몇 개의 문자 수를 읽지 않고 알 수 없기 때문에 ()가 읽을 수있는 문자 수를, gets ()는 버퍼 끝을 지나서 문자를 계속 저장하기 때문에 사용하는 것이 매우 위험합니다. 컴퓨터 보안을 중단하는 데 사용되었습니다. 대신 fgets ()를 사용하십시오.

gets () 대신 fgets ()를 사용하십시오.

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

gets () 함수는 버퍼의 길이를 확인하지 않고 끝을 지나서 스택을 변경할 수 있습니다. 이것은 당신이 듣는 "버퍼 오버플로"입니다.

사용해야 할 이유는 없습니다 gets(). C 표준조차도 마찬가지라고 말합니다! 사용 fgets() 대신에.

편집하다

경고가 링커에서 나온 것 같습니다. 컴파일 할 때 경고를 받습니까? -c? (링크를 비활성화합니다.)

당신은 사용해서는 안됩니다 gets 전혀 기능을 수행한다고 말합니다 fgets 대신에.

GCC는 GCC가 pragmas를 사용하여 경고를 비활성화하기 위해 수행하는 기능을 제공하지 않습니다. 다양한 것을 사용해야합니다 경고 옵션 대신 컴파일러에 플래그로.

안전한 대체를 제안하십시오 gets().

기존 코드에서 대체 gets(), 사용하는 것이 바람직하지 않을 수 있습니다 fgets() 그 기능에는 추가가 필요합니다 char 저장하려면 '\n' 두 기능 모두 소비하지만 gets() 저장하지 않습니다. 다음은 더 큰 버퍼 크기가 필요하지 않은 대체물입니다.

gets(dest) 대체됩니다 :
만약에 dest 배열, 사용입니다 gets_sz(dest, sizeof dest)
만약에 dest 에 대한 포인터입니다 char 크기의 배열 n, 사용 gets_sz(dest, n)

char *gets_sz(char *dest, size_t size) {
    if (size <= 1) {
        if (size <= 0 || feof(stdin)) {
            return NULL;
        }
    }
    size--;
    size_t i;
    for (i = 0; i < size; i++) {
        int ch = getchar();
        if (ch == EOF) {
            if (i == 0)
                return NULL;
            break;
        }
        if (ch == '\n')
            break;
        dest[i] = (char) ch;
    }
    dest[i] = 0;
    return dest;
}

정말로 그것을 사용하고 싶다면 깃발을 사용해보십시오. -fsyntax-only.

매뉴얼 GCC 웹 사이트 말 :

-fsyntax-only

Check the code for syntax errors, but don't do anything beyond that.

-fno-stack-protector 허용하는 옵션입니다 gets() 안전하지 않은 상태에도 불구하고 사용됩니다.

-Wno-deprecated-declarations 감가 상각 경고를 끕니다

다음은 컴파일의 예입니다 gets()

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

나는 프로그램이 버퍼를 오버런 할 수 있기 때문에 완전히 안전하지 않다고 말하는 모든 사람에게 동의합니다. 이것은 상당히 위험 할 수 있으므로 FGET에 찬성하여 더 이상 사용되지 않았습니다.

그러나 보안 과정에 대한 소개를받는 경우 버퍼 오버런 및 스택 오버 플로우의 개념을 사용하여 소규모 테스트 프로그램을 작성하는 것이 매우 도움이됩니다.

대중의 의견과는 달리 모든 프로그래머가 자신이 쓰는 것에 똑같이 부주의하지는 않습니다. gets() C90에서 항상 표준이 될 것이며 몇 가지 좋은 이유로 도서관에 배치되었습니다. 프로그램 예제, 문서화, 단위 테스트 스캐 폴딩, 숙제 과제 등과 같이 적절하게 사용할 때 다른 문자열 기능보다 더 이상 "위험하지 않습니다.

또 뭔데, gets() 그런 식으로 가독성을 향상시킵니다 fgets() 절대하지 않을 것입니다. 그리고 그 주장을 제기 할 명령을 찾기 위해 생각의 기차를 방해 할 필요는 없습니다.

다음 해결 방법은 내가 좋아하는 다른 기능을 사용하여 Newline을 제거합니다. :)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top