Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[analyzer] Improve valist checks and move it out from alpha state.
This patch makes the valist check more robust to the different AST variants on different platforms and also fixes a FIXME. Differential Revision: https://reviews.llvm.org/D30157 llvm-svn: 297153
- Loading branch information
Showing
5 changed files
with
202 additions
and
100 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,valist.Uninitialized,valist.CopyToSelf -analyzer-output=text -analyzer-store=region -verify %s | ||
|
||
#include "Inputs/system-header-simulator-for-valist.h" | ||
|
||
// This is called in call_inlined_uses_arg(), | ||
// and the warning is generated during the analysis of call_inlined_uses_arg(). | ||
void inlined_uses_arg(va_list arg) { | ||
(void)va_arg(arg, int); // expected-warning{{va_arg() is called on an uninitialized va_list}} | ||
// expected-note@-1{{va_arg() is called on an uninitialized va_list}} | ||
} | ||
|
||
void call_inlined_uses_arg(int fst, ...) { | ||
va_list va; | ||
inlined_uses_arg(va); // expected-note{{Calling 'inlined_uses_arg'}} | ||
} | ||
|
||
void f6(va_list *fst, ...) { | ||
va_start(*fst, fst); | ||
// FIXME: There should be no warning for this. | ||
(void)va_arg(*fst, int); // expected-warning{{va_arg() is called on an uninitialized va_list}} | ||
// expected-note@-1{{va_arg() is called on an uninitialized va_list}} | ||
va_end(*fst); | ||
} | ||
|
||
void call_vprintf_bad(int isstring, ...) { | ||
va_list va; | ||
vprintf(isstring ? "%s" : "%d", va); // expected-warning{{Function 'vprintf' is called with an uninitialized va_list argument}} | ||
// expected-note@-1{{Function 'vprintf' is called with an uninitialized va_list argument}} | ||
// expected-note@-2{{Assuming 'isstring' is 0}} | ||
// expected-note@-3{{'?' condition is false}} | ||
} | ||
|
||
void call_vsprintf_bad(char *buffer, ...) { | ||
va_list va; | ||
va_start(va, buffer); // expected-note{{Initialized va_list}} | ||
va_end(va); // expected-note{{Ended va_list}} | ||
vsprintf(buffer, "%s %d %d %lf %03d", va); // expected-warning{{Function 'vsprintf' is called with an uninitialized va_list argument}} | ||
// expected-note@-1{{Function 'vsprintf' is called with an uninitialized va_list argument}} | ||
} | ||
|
Oops, something went wrong.