2011-04-09 4 views
0

global 어설 션을 선언 할 수있는 언어가 있습니까? 즉, 전체 프로그램 실행 중에 보유해야하는 어설 션입니다. 있도록이 같은 기록 할 수있을 것입니다 :`global` 어서션?

global assert (-10 < speed < 10); 

을이 주장은 때마다 speed 변화 상태를 확인할 수 있습니까?

답변

-1

저는 이 실제로는과 같은 것을 인식하지 못합니다. 구현하기가 다소 어렵고 동시에 많은 것을 구현하지 못하기 때문에 의심의 여지가 있습니다. 사람들이 필요합니다.
입력이 유효하고 변경이 허용되고 정의 된 정상적인 방법으로 만 수행된다고 간단하게 주장하는 것이 좋습니다. 이것은 "글로벌 주장"의 필요성을 결론 짓는다.

당신은 어떤 것도 진정으로 우아한 없으며,이 오히려 시스템 의존하지만, 여러 가지 방법으로 "백도어를 통해"이 효과를 얻을 수 있습니다

:

  • 언어 연산자 (예 : 예를 들어, C++로) 오버로드를 허용하는 경우 값을 수정하는 연산자를 오버로드하는 클래스를 만들 수 있습니다. 그것은 상당한 작업이지만, 다른 한편으로는 사소한 것으로, 거기에 주장을하는 것입니다.
  • 거의 모든 시스템에서 프로세스에 속한 메모리 페이지의 보호를 변경할 수 있습니다. 변수 (및 어설 션하려는 다른 변수)를 별도로두고 페이지를 읽기 전용으로 설정할 수 있습니다. 이렇게하면 값을 기록 할 때 세그멘테이션 오류가 발생하며,이 값을 catch (어설 션이 참임을 확인) 할 수 있습니다. Windows는 "guard page"(실제로는 "읽기 전용 페이지")를 통해 명시 적으로 사용할 수 있습니다.
  • 대부분의 최신 프로세서는 하드웨어 중단 점을 지원합니다. 프로그램이 매우 이국적인 플랫폼에서 실행되는 경우가 아니라면이를 사용하여 보호 기능을 변경하는 것과 유사한 방식으로보다 세분화 된 제어를 수행 할 수 있습니다. 예를 들어 다른 사이트의 this article을 참조하십시오.이 사이트에서는 x86 기반 Windows에서이 작업을 수행하는 방법을 설명합니다. 이 솔루션을 사용하려면 일종의 "미니 디버거"를 작성해야하며 실제 디버거에서 프로그램을 실행할 때 문제가 발생할 수 있음을 의미합니다.
1

에펠은 모든 다른 계약을 지원합니다 : 전제 조건, 사후 조건, 불변 ... 당신은 그것을 사용하고 싶을 것입니다. 반면에 글로벌 변수가있는 이유는 무엇입니까?

속도를 수정하는 클래스를 만들면 어떨까요? 그렇게하면 값이 변경 될 때마다 쉽게 상태를 확인할 수 있습니다.