programing

C - 정수가 할당되었는지 확인

closeapi 2023. 9. 18. 21:27
반응형

C - 정수가 할당되었는지 확인

정수가 할당되지 않았는지 확인하려면 어떻게 해야 합니까?

int i; /* no assignment */

if (/* conditional statement here to check if int i is unassigned or not */) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

그럴수는 없어요.그것은 "정의되지 않은" 내용을 가지고 있을 것입니다. 즉, 그 때 그 메모리 위치에 있는 모든 것을 포함한다는 것을 의미합니다.

. . 글로벌 범위에서 i가 선언되지 않는 한 0으로 초기화됩니다.

C는 배열에 대한 경계 검사를 고유하게 지원하지 않는 것과 마찬가지로 이를 고유하게 지원하지 않습니다.이것은 속도/효율성과 안전성 사이의 균형입니다.

일반적으로...변수를 초기화합니다.

한다면i전역적이거나 정적이거나, 그 값은 다음과 같습니다.0이든 될 수 의 는 이든 이 인지 를 은 은 를 인지 이 .

초기화되지 않은 값을 사용하는 경우 컴파일러 경고를 요청할 수 있습니다.하지만 이들은 전적으로 신뢰할 수 있는 것은 아닙니다. DFA가 여러분이 희망하는 만큼 똑똑하지 않은 경우에는 가끔 거짓 긍정을 얻게 되고, 어쩌면 가끔 거짓 부정을 얻게 될 수도 있습니다. (그렇지 않기를 바라지만, 아무것도 약속하지 않습니다.)

GCC의 경우:

-Wuninitialized -O1

조건부 코드를 작성하려는 경우:

int a = 3;
int b;
int *p = (rand() > RAND_MAX/2) ? &a : &b;
if (is_uninitialized(*p)) // blah

그럼 운이 없겠군요일부 동적 언어와 달리 C는 "정의되지 않은 값"이라는 개념이 없습니다.변수가 초기화되지 않은 경우 나중에 검정할 수 있는 일부 특수 값이 주어지지 않습니다.값이 전혀 주어지지 않아 변수를 사용할 때 어떤 일이 일어나는지 정의되지 않습니다.

다른 사람들이 지적한 것처럼, 자신의 변수 중 하나가 초기화되지 않은 것을 감지하는 C 프로그램을 작성할 수는 없으며, 변수가 항상 초기화되도록 노력해야 합니다.

  • 모든 변수가 초기화되었는지 확인하는 것이 목표라면 valgrind와 같은 도구는 값비싼 런타임 분석을 통해 초기화되지 않은 변수의 사용을 동적으로 탐지할 수 있습니다.

  • 개인 데이터를 한 번만 초기화하는 것이 목표라면 일반적인 방법은 다음과 같이 보호하는 것입니다.

    int i;
    static bool initialized = 0;
    
    ... 
    if (!initialized) {
      initialized = 1;
      i = ... i's initial value ...;
    }
    

아주 간단해요.초기화하지 않았기 때문에 할당되지 않은 것으로 알고 있습니다.

이전의 모든 답변들과 마찬가지로, 런타임에 이를 감지할 수 있는 방법은 없습니다.그러나 할당되지 않은 변수에 대해 경고하는 거의 모든 정적 코드 분석 도구.

초기화(또는 할당) 전 변수를 사용하는 것은 오류의 심각한 원인입니다.런타임에는 안정적으로 확인할 수 없지만 컴파일 중이나 컴파일 전에는 탐지할 수 있습니다.

코드 안에서 확인하지 말 것을 제안합니다.컴파일러 경고가 발생할 수 있으므로(변수 'i'는 값이 할당되기 전에 사용됨), 새로운 오류를 도입하고 중대형 프로그램에서 성공할 가능성은 매우 낮습니다.

가장 좋은 방법은 정적 코드 분석 도구(QA/C 또는 PCLint 등)를 사용하는 것입니다.경고 민감도가 높은 컴파일러를 사용하는 것은 전문 도구로서 훨씬 적은 적용 범위로 무료 옵션입니다.

코드 리뷰를 수행하는 경우 초기화되지 않은 변수에 대한 체크리스트를 체크리스트에 포함시킬 수도 있습니다.이것이 보장되는 것은 아니지만 검토자로부터 수동 검사를 트리거할 것입니다.

원하는 런타임 검사일 경우 범위를 벗어난 값으로 변수를 초기화하여 시작할 수 있습니다.예를 들어, 양의 값의 경우 -1입니다.그럼 확인해보실 수 있습니다.

#define UNASSIGNED_VALUE -1
    static int number_of_apples = UNASSIGNED_VALUE;
    if (UNASSIGNED_VALUE == number_of_apples)
    {
       // error handling
    }

이것은 진정한 '초기화된' 변수는 아니지만, 적어도 당신은 합법적인 범위의 런타임 할당이 이루어졌는지 감지할 수 있습니다.

일반적으로 변수는 C 라이브러리에 의해 0으로 설정되지만 반드시 그렇지는 않습니다.

하지만 기본적으로 그럴 수는 없습니다.다음과 같이 정의의 기본값을 할당합니다.

int i = 0; /* Or what ever value you know won't be used elsewhere */

그런 다음 코드를 실행하여 값이 거기에 설정되어 있는지 확인하려면 초기 값과 비교할 수 있습니다.

C에서 정수는 생성될 때 정의되지 않은 값을 갖습니다.즉, 해당 정수를 처음 사용할 때 5893872가 포함된 레지스터/메모리 위치/장치에서 가져온 정수라면 이는 해당 정수의 값입니다.(마일리지는 디버그/릴리스 컴파일에 따라 달라집니다.)

이 문제를 해결하는 일반적인 방법은 무의미한 기본값을 사용하는 것입니다.

int number_of_widgets = -1;

...또는 그 상태를 나타내는 깃발:

int number_of_widgets;
int number_of_widgets_assigned = 0;

if (number_of_widgets_assigned)
  do something
else
  do something else
number_of_widgets_assigned = 1;

하드웨어의 디버깅 기능을 사용하고 싶지 않은 경우가 아니라면 무언가가 할당되었는지 여부를 탐지할 수 있는 다른 방법은 없습니다.

사용 중인 변수가 런타임에 초기화(할당)되는지 여부를 확인하는 것은 C에게 매우 어렵습니다.이를 위한 언어 지원은 없으며 런타임에 사용할 수 있는 정보는 초기화되지 않은 값을 완벽하게 탐지하기에 충분하지 않습니다.Valgrind/Memcheck와 같은 동적 분석 도구는 (프로세스의 주소 공간에 있는 메모리의 모든 바이트를 추적한 다음 모든 저장소를 조사하여 바이트를 초기화된 것으로 표시하는 등) 사용 값이 초기화되어 여전히 위양성에 취약한지 여부를 확인합니다.

프로그램에서 이러한 오류를 최소화하려는 경우 보풀과 같은 정적 분석 도구를 사용하면 초기화되지 않은 변수를 사용하는지 여부를 알 수 있습니다.사실, 대부분의 컴파일러들은 여러분이 언제 이 작업을 수행하는지 알려주기 위해 최선을 다할 것이라고 믿습니다. (하지만, 완벽하지는 않습니다.)

C#에서 다음을 사용합니다.

Nullable<int> i = null; /* null assignment */

if (i == null) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

이게 C로 번역이 될지는 모르겠지만요.

언급URL : https://stackoverflow.com/questions/1226489/c-check-if-integer-is-assigned

반응형