goto 누출 변수를 사용합니까?
goto
소멸자와 사물을 호출하지 않고 코드 비트를 건너 뛰는 것이 사실 입니까?
예 :
void f() {
int x = 0;
goto lol;
}
int main() {
f();
lol:
return 0;
}
x
유출 되지 않습니까?
경고 : 이 답변은 C ++ 에만 해당됩니다 . 규칙은 C에서 상당히 다릅니다.
x
유출 되지 않습니까?
아니, 절대 아닙니다.
goto
C ++의 기본 제공 범위 지정 메커니즘을 재정의 할 수있는 저수준 구조라는 신화입니다 . (무엇이든간에 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
'Programing' 카테고리의 다른 글
내 웹앱에서 시간대를 어떻게 처리 할 수 있습니까? (0) | 2020.09.04 |
---|---|
PDO 연결을 올바르게 설정하는 방법 (0) | 2020.09.04 |
TimeSpan ToString 형식 (0) | 2020.09.03 |
IOS에서 첫 번째 앱을 제출할 때 Xcode에서 번들 식별자 변경 (0) | 2020.09.03 |
Python matplotlib에서 x 축과 y 축의 스케일을 균일화하는 방법은 무엇입니까? (0) | 2020.09.03 |