diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:20:44 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:20:44 +0000 | 
| commit | 13cc256e404620c1de0cbcc4e43ce1e2dbbc4898 (patch) | |
| tree | 2732d02d7d51218d6eed98ac7fcfc5b8794896b5 /lib/Analysis/ScanfFormatString.cpp | |
| parent | 657bc3d9848e3be92029b2416031340988cd0111 (diff) | |
Notes
Diffstat (limited to 'lib/Analysis/ScanfFormatString.cpp')
| -rw-r--r-- | lib/Analysis/ScanfFormatString.cpp | 36 | 
1 files changed, 29 insertions, 7 deletions
| diff --git a/lib/Analysis/ScanfFormatString.cpp b/lib/Analysis/ScanfFormatString.cpp index 2942400621d1..574e56a5e068 100644 --- a/lib/Analysis/ScanfFormatString.cpp +++ b/lib/Analysis/ScanfFormatString.cpp @@ -13,6 +13,7 @@  //===----------------------------------------------------------------------===//  #include "clang/Analysis/Analyses/FormatString.h" +#include "clang/Basic/TargetInfo.h"  #include "FormatStringParsing.h"  using clang::analyze_format_string::ArgType; @@ -67,7 +68,8 @@ static ScanfSpecifierResult ParseScanfSpecifier(FormatStringHandler &H,                                                  const char *&Beg,                                                  const char *E,                                                  unsigned &argIndex, -                                                const LangOptions &LO) { +                                                const LangOptions &LO, +                                                const TargetInfo &Target) {    using namespace clang::analyze_scanf;    const char *I = Beg; @@ -172,6 +174,20 @@ static ScanfSpecifierResult ParseScanfSpecifier(FormatStringHandler &H,      case 'o': k = ConversionSpecifier::oArg; break;      case 's': k = ConversionSpecifier::sArg; break;      case 'p': k = ConversionSpecifier::pArg; break; +    // Apple extensions +      // Apple-specific +    case 'D': +      if (Target.getTriple().isOSDarwin()) +        k = ConversionSpecifier::DArg; +      break; +    case 'O': +      if (Target.getTriple().isOSDarwin()) +        k = ConversionSpecifier::OArg; +      break; +    case 'U': +      if (Target.getTriple().isOSDarwin()) +        k = ConversionSpecifier::UArg; +      break;    }    ScanfConversionSpecifier CS(conversionPosition, k);    if (k == ScanfConversionSpecifier::ScanListArg) { @@ -202,6 +218,7 @@ ArgType ScanfSpecifier::getArgType(ASTContext &Ctx) const {    switch(CS.getKind()) {      // Signed int.      case ConversionSpecifier::dArg: +    case ConversionSpecifier::DArg:      case ConversionSpecifier::iArg:        switch (LM.getKind()) {          case LengthModifier::None: @@ -233,7 +250,9 @@ ArgType ScanfSpecifier::getArgType(ASTContext &Ctx) const {      // Unsigned int.      case ConversionSpecifier::oArg: +    case ConversionSpecifier::OArg:      case ConversionSpecifier::uArg: +    case ConversionSpecifier::UArg:      case ConversionSpecifier::xArg:      case ConversionSpecifier::XArg:        switch (LM.getKind()) { @@ -430,9 +449,11 @@ bool ScanfSpecifier::fixType(QualType QT, const LangOptions &LangOpt,      namedTypeToLengthModifier(PT, LM);    // If fixing the length modifier was enough, we are done. -  const analyze_scanf::ArgType &AT = getArgType(Ctx); -  if (hasValidLengthModifier() && AT.isValid() && AT.matchesType(Ctx, QT)) -    return true; +  if (hasValidLengthModifier(Ctx.getTargetInfo())) { +    const analyze_scanf::ArgType &AT = getArgType(Ctx); +    if (AT.isValid() && AT.matchesType(Ctx, QT)) +      return true; +  }    // Figure out the conversion specifier.    if (PT->isRealFloatingType()) @@ -463,18 +484,19 @@ void ScanfSpecifier::toString(raw_ostream &os) const {  bool clang::analyze_format_string::ParseScanfString(FormatStringHandler &H,                                                      const char *I,                                                      const char *E, -                                                    const LangOptions &LO) { +                                                    const LangOptions &LO, +                                                    const TargetInfo &Target) {    unsigned argIndex = 0;    // Keep looking for a format specifier until we have exhausted the string.    while (I != E) {      const ScanfSpecifierResult &FSR = ParseScanfSpecifier(H, I, E, argIndex, -                                                          LO); +                                                          LO, Target);      // Did a fail-stop error of any kind occur when parsing the specifier?      // If so, don't do any more processing.      if (FSR.shouldStop()) -      return true;; +      return true;        // Did we exhaust the string or encounter an error that        // we can recover from?      if (!FSR.hasValue()) | 
