Programing

goto 누출 변수를 사용합니까?

crosscheck 2020. 9. 3. 07:37
반응형

goto 누출 변수를 사용합니까?


goto소멸자와 사물을 호출하지 않고 코드 비트를 건너 뛰는 것이 사실 입니까?

예 :

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

x유출 되지 않습니까?


경고 : 이 답변은 C ++ 에만 해당됩니다 . 규칙은 C에서 상당히 다릅니다.


x유출 되지 않습니까?

아니, 절대 아닙니다.

gotoC ++의 기본 제공 범위 지정 메커니즘을 재정의 할 수있는 저수준 구조라는 신화입니다 . (무엇이든간에 longjmp이것에 취약 할 수 있습니다.)

레이블 ( case레이블 포함 )을 사용 하여 "나쁜"작업을 수행하지 못하도록 방지하는 다음 메커니즘을 고려하십시오 .


1. 라벨 범위

함수를 건너 뛸 수 없습니다.

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

// error: label 'lol' used but not defined

[n3290: 6.1/1]:[..] 레이블의 범위는 레이블이 표시되는 기능입니다. [..]


2. 객체 초기화

객체 초기화를 건너 뛸 수 없습니다.

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}

// error: jump to label ‘lol’
// error:   from here
// error:   crosses initialization of ‘int x’

당신이 이동하면 다시 개체 초기화를 통해 다음 개체의 이전 "인스턴스"파괴 :

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   int x = 0;

  lol:
   T t;
   if (x++ < 5)
     goto lol;
}

// Output: *T~T*T~T*T~T*T~T*T~T*T~T

[n3290: 6.6/2]:[..] 루프 외부로, 블록 외부로 또는 자동 저장 기간이있는 초기화 된 변수를 지나서 이전에는 전송 된 지점에서 범위에 있지만 전송 된 지점이 아닌 자동 저장 기간이있는 객체의 파괴가 포함됩니다. . [..]

명시 적으로 초기화되지 않은 경우에도 개체의 범위로 이동할 수 없습니다.

int main() {
   goto lol;
   {
      std::string x;
lol:
      x = "";
   }
}

// error: jump to label ‘lol’
// error:   from here
// error:   crosses initialization of ‘std::string x’

... "복잡한"구성이 필요하지 않기 때문에 언어가 처리 할 수있는 특정 종류의 객체를 제외하고 :

int main() {
   goto lol;
   {
      int x;
lol:
      x = 0;
   }
}

// OK

[n3290: 6.7/3]: It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the preceding types and is declared without an initializer. [..]


3. Jumping abides by scope of other objects

Likewise, objects with automatic storage duration are not "leaked" when you goto out of their scope:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   {
      T t;
      goto lol;
   }

lol:
   return 0;
}

// *T~T

[n3290: 6.6/2]: On exit from a scope (however accomplished), objects with automatic storage duration (3.7.3) that have been constructed in that scope are destroyed in the reverse order of their construction. [..]


Conclusion

The above mechanisms ensure that goto doesn't let you break the language.

Of course, this doesn't automatically mean that you "should" use goto for any given problem, but it does mean that it is not nearly as "evil" as the common myth leads people to believe.

참고URL : https://stackoverflow.com/questions/7334952/will-using-goto-leak-variables

반응형