llvm/clang static analyzer reports

Stephan Bergmann sbergman at redhat.com
Thu Oct 1 06:59:03 UTC 2020

On 30/09/2020 21:36, Maarten Hoes wrote:
> [2]
> https://drive.google.com/file/d/1kbX_uo_jRqQkny1Qf6XYT1d72nUC8PO0/view?usp=sharing

The last discussion I find about running Clang Static Analyzer on the 
LibreOffice code base is the mail thread 
"Report from llvms static analysis tool" from five years ago.  Back then 
we had a list of 1385 issues, now we are at almost the same number of 
1348 issues.

 From a quick look at the list, I see instances of all of: clearly true 
positives, clearly false positives, and unclear findings.

* For example, "Use-after-move" 
2020-09-30-155842-506845-1/report-2cdbb5.html#EndPath is clearly a true 
positive (and one that e.g. Coverity Scan apparently doesn't find), see 
comment at 
"tdf#126959 impress table border resize handle support".

* For example, "Use-after-free" 
2020-09-30-155842-506845-1/report-366f11.html#EndPath (presumably along 
with many, many other of the 827 Use-after-free) is clearly a false 
positive:  While VclPtr::disposeAndClear holds

   ::rtl::Reference<reference_type> aTmp(m_rInnerRef);

the call to


cannot decrement m_rInnerRef's ref count to zero, so the following

   if (aTmp.get()) {

will /not/ access freed memory.  We would need some mechanism to filter 
out such identified false positives, with whatever mechanism would be 
suitable: an annotation in the source code, a modification of the 
-analyzer-... command line options passed to clang, etc.  However, that 
filtering should be done in an auditable way, so that we can later 
discover that we are filtering false positives relating to a certain 
location in the code, and can learn the rationale why those were 
considered false positives.  (Something that can be a pain with the way 
we use Coverity Scan, see below.)

* For example, "Result of operation is garbage or undefined" 
2020-09-30-155842-506845-1/report-78b0b7.html#EndPath is an unclear 
finding:  SfxSplitWindow::MoveWindow does not check the 
SfxSplitWindow::GetWindowPos return value and unconditionally uses nL 
(which is uninitialized when GetWindowPos returned false).  It can 
either be the case that GetWindowPos cannot return false here, so it 
would be a false positive (and the code in SfxSplitWindow::MoveWindow 
should arguably assert that the return value of GetWindowPos is true), 
or it indeed is a true positive.  It is hard to find out whether this 
issue had already been found by Coverity Scan and dismissed as a false 
positive through its Web UI.

More information about the LibreOffice mailing list