91 lines
3.1 KiB
Markdown
91 lines
3.1 KiB
Markdown
# Bisecting
|
||
|
||
NOTE: THIS IS WORK IN PROGRESS
|
||
|
||
`bisect.sh` is a script to bisect issues.
|
||
|
||
## Command
|
||
|
||
```
|
||
./bisect.sh <hash-good> <hash-bad> "<cppcheck-options>"
|
||
```
|
||
|
||
`hash-good` - the last known good commit hash - in case of daca it is the last tagged minor release (not patch release - i.e. 2.x)
|
||
`hash-bad` - the known bad commit hash - in case of daca the one from the `head-info:` line
|
||
`cppcheck-options` - the options for the Cppcheck invokation - in case of daca the ones from the `cppcheck-options:` line and the path to the folder/file to scan
|
||
|
||
If possible use `main` as the function to test stuff with since it won't emit an `unusedFunction` warning.
|
||
|
||
## Bisecting scan time regressions
|
||
|
||
We use daca to track differences in scan time. An overview of regressions in scan time can be found at http://cppcheck1.osuosl.org:8000/time_gt.html.
|
||
|
||
You need to download the archive as specified by the second line in the output and extract it.
|
||
|
||
If the overall scan time regressed you need to specify the whole folder.
|
||
|
||
If a timeout (potential hang) was introduced you can simply specify the file from `error: Internal error: Child process crashed with signal 15 [cppcheckError]`.
|
||
|
||
|
||
## Bisecting result regressions
|
||
|
||
Results regressions are being bisected based on the `--error-exitcode=` result.
|
||
If nothing is found the result will be `0` and it is treated as a _good_ commit.
|
||
If a finding occurs the result will be `1` which is treated as a _bad_ commit.
|
||
|
||
### False positive
|
||
|
||
Provide a code sample which will trigger the false postive.
|
||
|
||
```cpp
|
||
// cppcheck-suppress unusedFunction
|
||
static void f()
|
||
{
|
||
<code triggering FP>
|
||
}
|
||
```
|
||
|
||
### False negative
|
||
|
||
Provide a code sample which will trigger a `unmatchedSuppression`.
|
||
|
||
```cpp
|
||
// cppcheck-suppress unusedFunction
|
||
static void f()
|
||
{
|
||
// cppcheck-suppress unreadVariable
|
||
int i;
|
||
}
|
||
```
|
||
|
||
## Notes
|
||
|
||
### Compilation issues:
|
||
|
||
- 2.5 and before can only be built with GCC<=10 because of missing includes caused by cleanups within the standard headers. You need to specify `CXX=g++-10`.
|
||
- 1.88 and 1.89 cannot be compiled:
|
||
```
|
||
make: python: No such file or directory
|
||
```
|
||
- 1.39 to 1.49 (possibly more versions - 1.54 and up work) cannot be compiled:
|
||
```
|
||
lib/mathlib.cpp:70:42: error: invalid conversion from ‘char’ to ‘char**’ [-fpermissive]
|
||
70 | return std::strtoul(str.c_str(), '\0', 16);
|
||
| ^~~~
|
||
| |
|
||
| char
|
||
```
|
||
- some commits between 2.0 and 2.2 cannot be compiled:
|
||
```
|
||
cli/cppcheckexecutor.cpp:333:22: error: size of array ‘mytstack’ is not an integral constant-expression
|
||
333 | static char mytstack[MYSTACKSIZE]= {0}; // alternative stack for signal handler
|
||
| ^~~~~~~~~~~
|
||
```
|
||
RESOLVED: a hot-patch is applied before compilation.
|
||
- some commits between 1.54 and 1.55 cannot be compiled:
|
||
```
|
||
lib/preprocessor.cpp:2103:5: error: ‘errorLogger’ was not declared in this scope; did you mean ‘_errorLogger’?
|
||
2103 | errorLogger->reportInfo(errmsg);
|
||
| ^~~~~~~~~~~
|
||
| _errorLogger
|
||
``` |