문제

이런 일이 일어날 수 있습니까? 3 활성화 해야하는 곳을 주장합니다.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

프로그램이 G ++ 3.4.4의 어서를 활성화하지 않는 경우가있을 수 있습니다.

그리고 아니요, 어서가 활성화되지 않는 경우 숫자를 인쇄하기 위해 코드를 변경할 가능성이 없습니다.

어떤 아이디어?

편집 : 몇 가지 의견을 읽은 후 편집해야했습니다. 코드를 표시 하시겠습니까? 왜이 멍청한 일을하고 있습니까? 나는 그것을 믿지 않는다! 어디에서 사용됩니까? 내 질문에서 몇 가지 가능한 이유 때문에 코드를 게시/변경하지 않을 것이 분명해야합니다.

  • 나는 총 초보자이고 코드를 부끄러워합니다 (범죄는 없으며, 그 질문에 훨씬 쉽게 대답 할 수 있습니다.
  • 나는 정보가 거의없는 친구를 도와 달라는 요청을 받았습니다.
  • 컴파일러가없는 EMACS에 내 코드를 작성하고 있으며 컴파일하는 원격 서버로 전송하고 실행하며 무언가 잘못되면 실패한 Asser를 반환 할 수 있습니다.

내가 장난이나 사기를 만들고 있다고 믿는다면 대신 스레드 폐쇄에 투표해야했습니다. 나는 그것으로 완벽하게 괜찮 았을 것입니다. 그러나 이와 같은 불필요한 의견을 추가하면 "태도"깃발이 구현되기를 원했습니다.

나는 실제로 내 질문을 설명하고 대답하려고 시도한 그들의 의견과 답변에 대해 다른 사람들에게 감사하고 싶습니다.

도움이 되었습니까?

해결책

내 인생에서 너무 못생긴 것들을 보았 듯이 Perform_calc ()에 스택에서 리턴 주소를 덮어 쓰는 버퍼 오버런이 있으면 설명 할 수 있습니다. 함수가 끝나면, 덮어 쓰기 주소가 스택에서 복구되어 현재 PC로 설정되어 프로그램의 다른 영역에서 점프 할 수 있습니다.

이것은 매우 먼 가능성이지만, 당신이 보여주는 것입니다.

또 다른 가능성은 누군가가 못생긴 매크로 트릭을했을 것입니다. 같은 것이 있는지 확인하십시오

#define assert 

또는 일부 동료는 화장실에있는 동안 헤더에 이와 같은 것을 넣었습니다.

#define < ==
#define > ==

다른 답변에서 제안한 바와 같이, GCC -E를 확인하여 실제로 컴파일 된 코드를 확인하십시오.

다른 팁

assert 매크로 인 경우 검사되지 않습니다 NDEBUG 정의됩니다. 당신을 확인하십시오 #undef NDEBUG 이 번역 장치를 컴파일 할 때.

당신은 gcc를 호출 할 수 있습니다 -E Assert 문이 여전히 코드에 있는지 확인하려면 전환하십시오.

처음에는 그 코드가 올바른 것처럼 보이지 않습니다. 디버깅이 켜져있는 경우 (디버그 및/또는 _debug가 설정되고 ndebug가 설정되지 않음) :

assert( nr == 0);

위의 줄은 nr! = 0 인 경우 exit ()를 호출합니다. 따라서이 줄이 지나면 두 번째 어제는 다음을 실행합니다.

assert( nr > 0);

... 그리고 nr == 0 및! (nr> 0)이기 때문에 exit ()을 호출하십시오.

assert( nr < 0);

그리고이 세 번째 줄은 전혀 실행되지 않을 것입니다.

이 코드의 요점은 무엇입니까? 그리고 왜 이러한 어설 션을 추가 할 수 있다면 대신 printf ()를 추가 할 수 없습니까?

이 코드가 멀티 스레드입니까? 어쩌면 당신은 경쟁 조건.

그리고 숫자를 인쇄하기 위해 코드를 변경할 가능성이 없습니다 ..

이상한. Assert () 문을 삽입 할 수있는 능력이 있습니다. 실제로 실제 코드에 있으면 터치 할 수 없다면 코드가 작동 할 수 없기 때문입니다. 그렇다면 Assert () 호출 테스트 값을 인쇄 할 수없는 이유는 무엇입니까?

코드 조각을 소독하면서 실수로 문제를 제거했다고 생각합니다. 더 많은 코드가 있고 (그리고 NR이 어서들 사이에 변경되고 있습니다) 실제로는 그렇게 보이지 않습니다 (또는 RLBond에 따라 Ass를 켜지 않았습니다).

덜 위생화 된 코드 세그먼트를 게시하고 해결할 수 없는지 살펴 보겠습니다.

아마도 ? 이 경우 다음과 같은 주장은 실패합니다.

assert( nr == nr );
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top