코드를 확인하기 위해 2 가지 작업을 수행합니다. 철저한 그룹 코드 검토 (재 착오 실수 만 찾거나 스타일이나 다른 오류를 찾기 위해) 둘째, 문제에 대한 실질적인 공격. 예를 들어
:
int myfunction(int x, int y) {
REENTRANCE_CHECK;
... body of function
}
지금 당신이 할 수 중 하나를 (생산) 비어있는 REENTRANCE_CHECK를 #define한다하거나 기능을 검사하는 코드를 다시 입력하지 않습니다. 테스트를 실행 한 다음 (테스트가없는 경우 디버거가 연결된 상태에서 장치에서 실행) 이러한 검사가 활성화되어 있고 어떤 것이 떨어지는지 확인하십시오.
마찬가지로 디버그 논리를 추가하여 전역 상태에 대한 잘못된 업데이트를 검색 할 수 있습니다.이미 보유 할 때 취득하는 경우 주장 잠금 (사용하는 코드를 작성 같은
뭔가 :.
int my_global;
DEFINE_GLOBAL_LOCK(my_global);
void my_dangerous_function() {
...
LOCK_GLOBAL(my_global);
.. some critical section of code that uses my_global.
UNLOCK_GLOBAL(my_global);
...
}
다시를 DECLARE_GLOBAL_LOCK, LOCK_GLOBAL 및 UNLOCK_GLOBAL는 하나 (실제 잠금 코드로 #define에 의해 정의 할 수 있습니다 테스트 용으로 작성해야합니다).
이 접근법은 전역 상태에 대한 모든 액세스를 찾아서 랩핑하는 경우에만 작동하지만 검색은 쉽습니다 .
내가 이런 종류의 코드 검사를 할 때 내가 본 첫 번째 장소는 내 전역에있다. 전역 변수에 직접 액세스/조작하는 함수는 일반적으로 가장 많은 재진입 문제가있는 함수입니다. Secure가 언급했듯이 함수 인수 나 내부 데이터 만 수정하는 함수는 대개 OK입니다. 호출하는 라이브러리 함수 (표준 라이브러리 함수 포함)가 스레드로부터 안전하다는 것을 확인하는 것을 잊지 마십시오! – bta
알았습니다. 보안을 위해 & bta에게 조언 해 주셔서 감사합니다. –
"콜백/종속성 삽입으로 숨김"또는 시그널 핸들러. –