CStringChecker is a huge beast.
My effort in improving the analyzer regarding taint analysis is humbled by multiple factors.
I wanted to extend the diagnostics of the CStringChecker with taintedness.
In the long run, the diagnostic emitting parts of the GenericTaintChecker would be migrated to multiple checkers, leaving it's responsibility only to *model* taint propagation.
Eg. the GenericTaintChecker::checkTaintedBufferSize functionality will be mostly part of the CStringChecker.
This plan requires the CStringChecker to be refactored to support a more flexible reporting mechanism.
This patch does only refactorings, such:
- eliminates always false parameters (like WarnAboutSize)
- reduces the number of parameters
- makes strong types differentiating *source* and *destination* buffers (same with size expressions)
- binds the argument expression and the index, making diagnostics accurate and easy to emit
- removes a bunch of default parameters to make it more readable
- remove random const char * warning message parameters, making clear where and what is going to be emitted
Note that:
- CheckBufferAccess now checks *only* one buffer, this removed about 100 LOC code duplication
- not every function was refactored to use the /new/ strongly typed API, since the CString related functions are really closely coupled monolithic beasts, I will refactor them separately
- all tests are preserved and passing; only *the message changed at some places*. In my opinion, these messages are holding the same information.
I would also highlight that this refactoring caught a bug in clang/test/Analysis/string.c:454 where the diagnostic did not reflect reality. This catch backs my effort on simplifying this monolithic CStringChecker.
I'm not marking it const in this patch since the 496th line swaps two instances of this class, so it cannot be done without refactoring that function.