2009-09-24 2 views
2

다음은 의미하는 두통 중 하나의 예입니다.L "% s"와 같은 와이드 문자열 두통을 찾는 가장 좋은 방법은 무엇입니까?

텍스트를 화면에 렌더링하는 데 대부분 유니 코드 문자열을 사용하는 다중 플랫폼 프로젝트가 있습니다. VC의 창에 줄을 ++ :

swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString); 

잘 컴파일하고 다른 넓은 문자열로 넓은 문자열을 인쇄합니다. 그러나이 정말해야합니다 :

swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString); 

에 '% ls'이 (가)이 다른 플랫폼에서 작동하지 않습니다와 '% s'을 (를) 교체하지 않고. Windows 환경에서의 테스트는 쉽고 빠르며 디버그하기가 훨씬 쉽습니다. 이런 종류의 버그는 쉽게 눈에 띄지 않을 수 있습니다.

가장 좋은 해결책은 처음부터 올바른 코드를 작성하는 것이지만 압력을 받고 간단한 실수가 발생하는 경우이며,이 특별한 경우에는 오랫동안 쉽게 실수를 알 수 있습니다.

나는 우리가 아직 즐기지 못하는 이런 종류의 버그에 많은 변종이 있다고 생각한다.

누구나 이런 종류의 버그를 찾는 좋은 방법이 있습니까?

: D

+0

"정말로" "% ls"이어야하는 이유는 무엇입니까? '% s'는'swprintf'에 넘겨지는 넓은 문자열에 대해서는 문제가 없습니다. – avakar

+0

''% s '을'% ls '(으)로 바꾸지 않으면 다른 플랫폼에서 작동하지 않습니다.' –

답변

2

당신도

  • 정규 표현식을 통해 가능한 오류를 검색 어쩌면, 형태 보증 된 또 다른 접근 방식을 사용하여 수동으로
  • 을 오류를 수정 형태 보증 *printf 가족의 기능 중 어느 것도없는 것처럼 문자열 스트림을 기반으로하거나 boost.format
+0

정규식 검색이 유일한 쉬운 방법 인 것 같습니다. 어떤 종류의 마법 컴파일러 해킹이나 뭔가를 찾기를 바랬지 만,이 경우에는 무력이 유일한 옵션이라고 생각합니다. –

+0

슬프게도 몇 가지 제한 사항을 해결할 수 없습니다. 더 편한 점은 전처리 기나 컴파일러에서 문자열 내용을 기반으로 매개 변수를 typecheck하기위한 문자열 처리 기능이 필요하다는 것입니다. 전처리 기가이를 수행 할 수없고 템플리트가 전체 문자열 리터럴에 액세스 할 수 없습니다 (단, C++ 0x : http://arcticinteractive.com/2009/08/15/cpp-compile-time-string-parser-prototype/) –

+0

... 슬픈 듯이 슬픈 듯이 링크의 아이디어가 기반으로 한 양식이 C++ 0x. –

4

Boost.Format이 당신의 필요에 비해 너무 느리다면.

  • IOSTREAMS : : stringstream을 사용하고 Boost.Format에 비해

    FastFormat.Format 모든 경우에, 100-900 ~ 사이 %로, IOSTREAMS보다 빠른

  • Boost.Format : FastFormat.Format 모든 경우에, 400-1650 ~ 사이 %로, Boost.Format보다 빠른
+2

필자는 * printf 함수를 대체하기 위해 FastFormat을 엔진에 통합하는 것이 장기적인 해결책이라고 생각합니다. 잘하면 우리가 그것을 통합하는 방법에 따라 더 잘이 문제를 추적 할 수있게해야하지만, 그것은 또한 좋은 작은 보너스입니다 빠른 수행 할 것입니다! –