Add 'ConversionSpecifier' root class in 'analyze_format_string' namespace and

derived 'PrintfConversionSpecifier' from this class.  We will do the same for
'ScanfConversionSpecifier'.

llvm-svn: 108903
This commit is contained in:
Ted Kremenek
2010-07-20 20:04:27 +00:00
parent fe1316882c
commit f03e6d85a1
4 changed files with 143 additions and 113 deletions

View File

@@ -19,14 +19,14 @@ using clang::analyze_format_string::ArgTypeResult;
using clang::analyze_format_string::FormatStringHandler;
using clang::analyze_format_string::LengthModifier;
using clang::analyze_format_string::OptionalAmount;
using clang::analyze_scanf::ConversionSpecifier;
using clang::analyze_scanf::ScanfConversionSpecifier;
using clang::analyze_scanf::ScanfSpecifier;
typedef clang::analyze_format_string::SpecifierResult<ScanfSpecifier>
ScanfSpecifierResult;
static bool ParseScanList(FormatStringHandler &H,
ConversionSpecifier &CS,
ScanfConversionSpecifier &CS,
const char *&Beg, const char *E) {
const char *I = Beg;
const char *start = I - 1;
@@ -142,34 +142,34 @@ static ScanfSpecifierResult ParseScanfSpecifier(FormatStringHandler &H,
// Finally, look for the conversion specifier.
const char *conversionPosition = I++;
ConversionSpecifier::Kind k = ConversionSpecifier::InvalidSpecifier;
ScanfConversionSpecifier::Kind k = ScanfConversionSpecifier::InvalidSpecifier;
switch (*conversionPosition) {
default:
break;
case '%': k = ConversionSpecifier::PercentArg; break;
case 'A': k = ConversionSpecifier::AArg; break;
case 'E': k = ConversionSpecifier::EArg; break;
case 'F': k = ConversionSpecifier::FArg; break;
case 'G': k = ConversionSpecifier::GArg; break;
case 'X': k = ConversionSpecifier::XArg; break;
case 'a': k = ConversionSpecifier::aArg; break;
case 'd': k = ConversionSpecifier::dArg; break;
case 'e': k = ConversionSpecifier::eArg; break;
case 'f': k = ConversionSpecifier::fArg; break;
case 'g': k = ConversionSpecifier::gArg; break;
case 'i': k = ConversionSpecifier::iArg; break;
case 'n': k = ConversionSpecifier::nArg; break;
case 'c': k = ConversionSpecifier::cArg; break;
case 'C': k = ConversionSpecifier::CArg; break;
case 'S': k = ConversionSpecifier::SArg; break;
case '[': k = ConversionSpecifier::ScanListArg; break;
case 'u': k = ConversionSpecifier::uArg; break;
case 'x': k = ConversionSpecifier::xArg; break;
case 'o': k = ConversionSpecifier::oArg; break;
case 's': k = ConversionSpecifier::sArg; break;
case '%': k = ScanfConversionSpecifier::PercentArg; break;
case 'A': k = ScanfConversionSpecifier::AArg; break;
case 'E': k = ScanfConversionSpecifier::EArg; break;
case 'F': k = ScanfConversionSpecifier::FArg; break;
case 'G': k = ScanfConversionSpecifier::GArg; break;
case 'X': k = ScanfConversionSpecifier::XArg; break;
case 'a': k = ScanfConversionSpecifier::aArg; break;
case 'd': k = ScanfConversionSpecifier::dArg; break;
case 'e': k = ScanfConversionSpecifier::eArg; break;
case 'f': k = ScanfConversionSpecifier::fArg; break;
case 'g': k = ScanfConversionSpecifier::gArg; break;
case 'i': k = ScanfConversionSpecifier::iArg; break;
case 'n': k = ScanfConversionSpecifier::nArg; break;
case 'c': k = ScanfConversionSpecifier::cArg; break;
case 'C': k = ScanfConversionSpecifier::CArg; break;
case 'S': k = ScanfConversionSpecifier::SArg; break;
case '[': k = ScanfConversionSpecifier::ScanListArg; break;
case 'u': k = ScanfConversionSpecifier::uArg; break;
case 'x': k = ScanfConversionSpecifier::xArg; break;
case 'o': k = ScanfConversionSpecifier::oArg; break;
case 's': k = ScanfConversionSpecifier::sArg; break;
}
ConversionSpecifier CS(conversionPosition, k);
if (k == ConversionSpecifier::ScanListArg) {
ScanfConversionSpecifier CS(conversionPosition, k);
if (k == ScanfConversionSpecifier::ScanListArg) {
if (!ParseScanList(H, CS, I, E))
return true;
}
@@ -181,7 +181,7 @@ static ScanfSpecifierResult ParseScanfSpecifier(FormatStringHandler &H,
// FIXME: '%' and '*' doesn't make sense. Issue a warning.
// FIXME: 'ConsumedSoFar' and '*' doesn't make sense.
if (k == ConversionSpecifier::InvalidSpecifier) {
if (k == ScanfConversionSpecifier::InvalidSpecifier) {
// Assume the conversion takes one argument.
return !H.HandleInvalidScanfConversionSpecifier(FS, Beg, I - Beg);
}