diff options
author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-06-10 16:13:32 +0000 |
---|---|---|
committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-06-10 16:13:32 +0000 |
commit | a08050302beb754c95b4a7ae1bad880ab0ea3564 (patch) | |
tree | 76a7a5a5050a10cbf87b2fd97e3018f723a711a7 /contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp | |
parent | 54e57c8145e0c37cc49e92adf0021c7da62587d6 (diff) | |
download | src-test2-a08050302beb754c95b4a7ae1bad880ab0ea3564.tar.gz src-test2-a08050302beb754c95b4a7ae1bad880ab0ea3564.zip |
Notes
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp b/contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp index c38aae34764c..0b111e9ef4d9 100644 --- a/contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp +++ b/contrib/llvm/tools/clang/lib/Analysis/PrintfFormatString.cpp @@ -210,7 +210,8 @@ static bool ParseArgPosition(FormatStringHandler &H, static FormatSpecifierResult ParseFormatSpecifier(FormatStringHandler &H, const char *&Beg, const char *E, - unsigned &argIndex) { + unsigned &argIndex, + bool FormatExtensions) { using namespace clang::analyze_printf; @@ -369,11 +370,19 @@ static FormatSpecifierResult ParseFormatSpecifier(FormatStringHandler &H, case '@': k = ConversionSpecifier::ObjCObjArg; break; // Glibc specific. case 'm': k = ConversionSpecifier::PrintErrno; break; + // FreeBSD format extensions + case 'b': if (FormatExtensions) k = ConversionSpecifier::bArg; break; /* check for int and then char * */ + case 'r': if (FormatExtensions) k = ConversionSpecifier::xArg; break; + case 'y': if (FormatExtensions) k = ConversionSpecifier::iArg; break; + case 'D': if (FormatExtensions) k = ConversionSpecifier::DArg; break; /* check for u_char * pointer and a char * string */ } ConversionSpecifier CS(conversionPosition, k); FS.setConversionSpecifier(CS); if (CS.consumesDataArgument() && !FS.usesPositionalArg()) FS.setArgIndex(argIndex++); + // FreeBSD extension + if (k == ConversionSpecifier::bArg || k == ConversionSpecifier::DArg) + argIndex++; if (k == ConversionSpecifier::InvalidSpecifier) { // Assume the conversion takes one argument. @@ -383,13 +392,13 @@ static FormatSpecifierResult ParseFormatSpecifier(FormatStringHandler &H, } bool clang::analyze_printf::ParseFormatString(FormatStringHandler &H, - const char *I, const char *E) { + const char *I, const char *E, bool FormatExtensions) { unsigned argIndex = 0; // Keep looking for a format specifier until we have exhausted the string. while (I != E) { - const FormatSpecifierResult &FSR = ParseFormatSpecifier(H, I, E, argIndex); + const FormatSpecifierResult &FSR = ParseFormatSpecifier(H, I, E, argIndex, FormatExtensions); // Did a fail-stop error of any kind occur when parsing the specifier? // If so, don't do any more processing. if (FSR.shouldStop()) |