Qual é a melhor maneira de encontrar dores de cabeça cordas largas tais como L “% s”?
-
16-09-2019 - |
Pergunta
Aqui está um exemplo de uma das dores de cabeça que quero dizer:
Temos um projeto multiplataforma que utiliza principalmente cadeias de caracteres Unicode para processamento de texto para a tela. No windows em VC ++ a linha:
swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString);
compila bem e imprime a ampla cadeia de caracteres em outra seqüência de largura. No entanto, isso realmente deve ser:
swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString);
Sem substituir o '% s' com um '% ls' isto não vai funcionar em outras plataformas. Como testar em nosso ambiente no Windows é mais fácil, mais rápido e muito mais simples de depuração. Este tipo de erros pode facilmente passar despercebida.
Eu sei que a melhor solução é escrever código correto em primeiro lugar, mas sob pressão erros simples são feitas, e neste caso particular, o erro pode facilmente passar despercebida por um longo tempo.
Eu suspeito que há muitas variações sobre esse tipo de erro, que ainda estão para desfrutar.
Alguém tem uma agradável e maneira pura de encontrar este tipo de bugs?
: D
Solução
Como nenhuma das funções da família *printf
são typesafe você quer
- procurar erros prováveis ??através de expressões regulares e corrigi-los manualmente
- usar uma outra abordagem que é typesafe, talvez com base em stringstreams ou boost.format
Outras dicas
Você pode querer ter um olhar para FastFormat em caso Boost.Format é muito lento para as suas necessidades .
Em comparação com stringstreams e Boost.Format:
- iostreams: FastFormat.Format é mais rápido do que iostreams, por entre ~ 100-900%, em todos os casos
- Boost.Format: FastFormat.Format é mais rápido do que Boost.Format, por entre ~ 400-1650%, em todos os casos