FormatString.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. // FormatString.cpp - Common stuff for handling printf/scanf formats -*- C++ -*-
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // Shared details for processing format strings of printf and scanf
  11. // (and friends).
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "FormatStringParsing.h"
  15. #include "clang/Basic/LangOptions.h"
  16. #include "clang/Basic/TargetInfo.h"
  17. using clang::analyze_format_string::ArgType;
  18. using clang::analyze_format_string::FormatStringHandler;
  19. using clang::analyze_format_string::FormatSpecifier;
  20. using clang::analyze_format_string::LengthModifier;
  21. using clang::analyze_format_string::OptionalAmount;
  22. using clang::analyze_format_string::PositionContext;
  23. using clang::analyze_format_string::ConversionSpecifier;
  24. using namespace clang;
  25. // Key function to FormatStringHandler.
  26. FormatStringHandler::~FormatStringHandler() {}
  27. //===----------------------------------------------------------------------===//
  28. // Functions for parsing format strings components in both printf and
  29. // scanf format strings.
  30. //===----------------------------------------------------------------------===//
  31. OptionalAmount
  32. clang::analyze_format_string::ParseAmount(const char *&Beg, const char *E) {
  33. const char *I = Beg;
  34. UpdateOnReturn <const char*> UpdateBeg(Beg, I);
  35. unsigned accumulator = 0;
  36. bool hasDigits = false;
  37. for ( ; I != E; ++I) {
  38. char c = *I;
  39. if (c >= '0' && c <= '9') {
  40. hasDigits = true;
  41. accumulator = (accumulator * 10) + (c - '0');
  42. continue;
  43. }
  44. if (hasDigits)
  45. return OptionalAmount(OptionalAmount::Constant, accumulator, Beg, I - Beg,
  46. false);
  47. break;
  48. }
  49. return OptionalAmount();
  50. }
  51. OptionalAmount
  52. clang::analyze_format_string::ParseNonPositionAmount(const char *&Beg,
  53. const char *E,
  54. unsigned &argIndex) {
  55. if (*Beg == '*') {
  56. ++Beg;
  57. return OptionalAmount(OptionalAmount::Arg, argIndex++, Beg, 0, false);
  58. }
  59. return ParseAmount(Beg, E);
  60. }
  61. OptionalAmount
  62. clang::analyze_format_string::ParsePositionAmount(FormatStringHandler &H,
  63. const char *Start,
  64. const char *&Beg,
  65. const char *E,
  66. PositionContext p) {
  67. if (*Beg == '*') {
  68. const char *I = Beg + 1;
  69. const OptionalAmount &Amt = ParseAmount(I, E);
  70. if (Amt.getHowSpecified() == OptionalAmount::NotSpecified) {
  71. H.HandleInvalidPosition(Beg, I - Beg, p);
  72. return OptionalAmount(false);
  73. }
  74. if (I == E) {
  75. // No more characters left?
  76. H.HandleIncompleteSpecifier(Start, E - Start);
  77. return OptionalAmount(false);
  78. }
  79. assert(Amt.getHowSpecified() == OptionalAmount::Constant);
  80. if (*I == '$') {
  81. // Handle positional arguments
  82. // Special case: '*0$', since this is an easy mistake.
  83. if (Amt.getConstantAmount() == 0) {
  84. H.HandleZeroPosition(Beg, I - Beg + 1);
  85. return OptionalAmount(false);
  86. }
  87. const char *Tmp = Beg;
  88. Beg = ++I;
  89. return OptionalAmount(OptionalAmount::Arg, Amt.getConstantAmount() - 1,
  90. Tmp, 0, true);
  91. }
  92. H.HandleInvalidPosition(Beg, I - Beg, p);
  93. return OptionalAmount(false);
  94. }
  95. return ParseAmount(Beg, E);
  96. }
  97. bool
  98. clang::analyze_format_string::ParseFieldWidth(FormatStringHandler &H,
  99. FormatSpecifier &CS,
  100. const char *Start,
  101. const char *&Beg, const char *E,
  102. unsigned *argIndex) {
  103. // FIXME: Support negative field widths.
  104. if (argIndex) {
  105. CS.setFieldWidth(ParseNonPositionAmount(Beg, E, *argIndex));
  106. }
  107. else {
  108. const OptionalAmount Amt =
  109. ParsePositionAmount(H, Start, Beg, E,
  110. analyze_format_string::FieldWidthPos);
  111. if (Amt.isInvalid())
  112. return true;
  113. CS.setFieldWidth(Amt);
  114. }
  115. return false;
  116. }
  117. bool
  118. clang::analyze_format_string::ParseArgPosition(FormatStringHandler &H,
  119. FormatSpecifier &FS,
  120. const char *Start,
  121. const char *&Beg,
  122. const char *E) {
  123. const char *I = Beg;
  124. const OptionalAmount &Amt = ParseAmount(I, E);
  125. if (I == E) {
  126. // No more characters left?
  127. H.HandleIncompleteSpecifier(Start, E - Start);
  128. return true;
  129. }
  130. if (Amt.getHowSpecified() == OptionalAmount::Constant && *(I++) == '$') {
  131. // Warn that positional arguments are non-standard.
  132. H.HandlePosition(Start, I - Start);
  133. // Special case: '%0$', since this is an easy mistake.
  134. if (Amt.getConstantAmount() == 0) {
  135. H.HandleZeroPosition(Start, I - Start);
  136. return true;
  137. }
  138. FS.setArgIndex(Amt.getConstantAmount() - 1);
  139. FS.setUsesPositionalArg();
  140. // Update the caller's pointer if we decided to consume
  141. // these characters.
  142. Beg = I;
  143. return false;
  144. }
  145. return false;
  146. }
  147. bool
  148. clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS,
  149. const char *&I,
  150. const char *E,
  151. const LangOptions &LO,
  152. bool IsScanf) {
  153. LengthModifier::Kind lmKind = LengthModifier::None;
  154. const char *lmPosition = I;
  155. switch (*I) {
  156. default:
  157. return false;
  158. case 'h':
  159. ++I;
  160. lmKind = (I != E && *I == 'h') ? (++I, LengthModifier::AsChar)
  161. : LengthModifier::AsShort;
  162. break;
  163. case 'l':
  164. ++I;
  165. lmKind = (I != E && *I == 'l') ? (++I, LengthModifier::AsLongLong)
  166. : LengthModifier::AsLong;
  167. break;
  168. case 'j': lmKind = LengthModifier::AsIntMax; ++I; break;
  169. case 'z': lmKind = LengthModifier::AsSizeT; ++I; break;
  170. case 't': lmKind = LengthModifier::AsPtrDiff; ++I; break;
  171. case 'L': lmKind = LengthModifier::AsLongDouble; ++I; break;
  172. case 'q': lmKind = LengthModifier::AsQuad; ++I; break;
  173. case 'a':
  174. if (IsScanf && !LO.C99 && !LO.CPlusPlus11) {
  175. // For scanf in C90, look at the next character to see if this should
  176. // be parsed as the GNU extension 'a' length modifier. If not, this
  177. // will be parsed as a conversion specifier.
  178. ++I;
  179. if (I != E && (*I == 's' || *I == 'S' || *I == '[')) {
  180. lmKind = LengthModifier::AsAllocate;
  181. break;
  182. }
  183. --I;
  184. }
  185. return false;
  186. case 'm':
  187. if (IsScanf) {
  188. lmKind = LengthModifier::AsMAllocate;
  189. ++I;
  190. break;
  191. }
  192. return false;
  193. // printf: AsInt64, AsInt32, AsInt3264
  194. // scanf: AsInt64
  195. case 'I':
  196. if (I + 1 != E && I + 2 != E) {
  197. if (I[1] == '6' && I[2] == '4') {
  198. I += 3;
  199. lmKind = LengthModifier::AsInt64;
  200. break;
  201. }
  202. if (IsScanf)
  203. return false;
  204. if (I[1] == '3' && I[2] == '2') {
  205. I += 3;
  206. lmKind = LengthModifier::AsInt32;
  207. break;
  208. }
  209. }
  210. ++I;
  211. lmKind = LengthModifier::AsInt3264;
  212. break;
  213. case 'w':
  214. lmKind = LengthModifier::AsWide; ++I; break;
  215. }
  216. LengthModifier lm(lmPosition, lmKind);
  217. FS.setLengthModifier(lm);
  218. return true;
  219. }
  220. //===----------------------------------------------------------------------===//
  221. // Methods on ArgType.
  222. //===----------------------------------------------------------------------===//
  223. clang::analyze_format_string::ArgType::MatchKind
  224. ArgType::matchesType(ASTContext &C, QualType argTy) const {
  225. if (Ptr) {
  226. // It has to be a pointer.
  227. const PointerType *PT = argTy->getAs<PointerType>();
  228. if (!PT)
  229. return NoMatch;
  230. // We cannot write through a const qualified pointer.
  231. if (PT->getPointeeType().isConstQualified())
  232. return NoMatch;
  233. argTy = PT->getPointeeType();
  234. }
  235. switch (K) {
  236. case InvalidTy:
  237. llvm_unreachable("ArgType must be valid");
  238. case UnknownTy:
  239. return Match;
  240. case AnyCharTy: {
  241. if (const EnumType *ETy = argTy->getAs<EnumType>())
  242. argTy = ETy->getDecl()->getIntegerType();
  243. if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
  244. switch (BT->getKind()) {
  245. default:
  246. break;
  247. case BuiltinType::Char_S:
  248. case BuiltinType::SChar:
  249. case BuiltinType::UChar:
  250. case BuiltinType::Char_U:
  251. return Match;
  252. }
  253. return NoMatch;
  254. }
  255. case SpecificTy: {
  256. if (const EnumType *ETy = argTy->getAs<EnumType>())
  257. argTy = ETy->getDecl()->getIntegerType();
  258. argTy = C.getCanonicalType(argTy).getUnqualifiedType();
  259. if (T == argTy)
  260. return Match;
  261. // Check for "compatible types".
  262. if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
  263. switch (BT->getKind()) {
  264. default:
  265. break;
  266. case BuiltinType::Char_S:
  267. case BuiltinType::SChar:
  268. case BuiltinType::Char_U:
  269. case BuiltinType::UChar:
  270. return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match
  271. : NoMatch;
  272. case BuiltinType::Short:
  273. return T == C.UnsignedShortTy ? Match : NoMatch;
  274. case BuiltinType::UShort:
  275. return T == C.ShortTy ? Match : NoMatch;
  276. case BuiltinType::Int:
  277. return T == C.UnsignedIntTy ? Match : NoMatch;
  278. case BuiltinType::UInt:
  279. return T == C.IntTy ? Match : NoMatch;
  280. case BuiltinType::Long:
  281. return T == C.UnsignedLongTy ? Match : NoMatch;
  282. case BuiltinType::ULong:
  283. return T == C.LongTy ? Match : NoMatch;
  284. case BuiltinType::LongLong:
  285. return T == C.UnsignedLongLongTy ? Match : NoMatch;
  286. case BuiltinType::ULongLong:
  287. return T == C.LongLongTy ? Match : NoMatch;
  288. }
  289. return NoMatch;
  290. }
  291. case CStrTy: {
  292. const PointerType *PT = argTy->getAs<PointerType>();
  293. if (!PT)
  294. return NoMatch;
  295. QualType pointeeTy = PT->getPointeeType();
  296. if (const BuiltinType *BT = pointeeTy->getAs<BuiltinType>())
  297. switch (BT->getKind()) {
  298. case BuiltinType::Void:
  299. case BuiltinType::Char_U:
  300. case BuiltinType::UChar:
  301. case BuiltinType::Char_S:
  302. case BuiltinType::SChar:
  303. return Match;
  304. default:
  305. break;
  306. }
  307. return NoMatch;
  308. }
  309. case WCStrTy: {
  310. const PointerType *PT = argTy->getAs<PointerType>();
  311. if (!PT)
  312. return NoMatch;
  313. QualType pointeeTy =
  314. C.getCanonicalType(PT->getPointeeType()).getUnqualifiedType();
  315. return pointeeTy == C.getWideCharType() ? Match : NoMatch;
  316. }
  317. case WIntTy: {
  318. QualType PromoArg =
  319. argTy->isPromotableIntegerType()
  320. ? C.getPromotedIntegerType(argTy) : argTy;
  321. QualType WInt = C.getCanonicalType(C.getWIntType()).getUnqualifiedType();
  322. PromoArg = C.getCanonicalType(PromoArg).getUnqualifiedType();
  323. // If the promoted argument is the corresponding signed type of the
  324. // wint_t type, then it should match.
  325. if (PromoArg->hasSignedIntegerRepresentation() &&
  326. C.getCorrespondingUnsignedType(PromoArg) == WInt)
  327. return Match;
  328. return WInt == PromoArg ? Match : NoMatch;
  329. }
  330. case CPointerTy:
  331. if (argTy->isVoidPointerType()) {
  332. return Match;
  333. } if (argTy->isPointerType() || argTy->isObjCObjectPointerType() ||
  334. argTy->isBlockPointerType() || argTy->isNullPtrType()) {
  335. return NoMatchPedantic;
  336. } else {
  337. return NoMatch;
  338. }
  339. case ObjCPointerTy: {
  340. if (argTy->getAs<ObjCObjectPointerType>() ||
  341. argTy->getAs<BlockPointerType>())
  342. return Match;
  343. // Handle implicit toll-free bridging.
  344. if (const PointerType *PT = argTy->getAs<PointerType>()) {
  345. // Things such as CFTypeRef are really just opaque pointers
  346. // to C structs representing CF types that can often be bridged
  347. // to Objective-C objects. Since the compiler doesn't know which
  348. // structs can be toll-free bridged, we just accept them all.
  349. QualType pointee = PT->getPointeeType();
  350. if (pointee->getAsStructureType() || pointee->isVoidType())
  351. return Match;
  352. }
  353. return NoMatch;
  354. }
  355. }
  356. llvm_unreachable("Invalid ArgType Kind!");
  357. }
  358. QualType ArgType::getRepresentativeType(ASTContext &C) const {
  359. QualType Res;
  360. switch (K) {
  361. case InvalidTy:
  362. llvm_unreachable("No representative type for Invalid ArgType");
  363. case UnknownTy:
  364. llvm_unreachable("No representative type for Unknown ArgType");
  365. case AnyCharTy:
  366. Res = C.CharTy;
  367. break;
  368. case SpecificTy:
  369. Res = T;
  370. break;
  371. case CStrTy:
  372. Res = C.getPointerType(C.CharTy);
  373. break;
  374. case WCStrTy:
  375. Res = C.getPointerType(C.getWideCharType());
  376. break;
  377. case ObjCPointerTy:
  378. Res = C.ObjCBuiltinIdTy;
  379. break;
  380. case CPointerTy:
  381. Res = C.VoidPtrTy;
  382. break;
  383. case WIntTy: {
  384. Res = C.getWIntType();
  385. break;
  386. }
  387. }
  388. if (Ptr)
  389. Res = C.getPointerType(Res);
  390. return Res;
  391. }
  392. std::string ArgType::getRepresentativeTypeName(ASTContext &C) const {
  393. std::string S = getRepresentativeType(C).getAsString();
  394. std::string Alias;
  395. if (Name) {
  396. // Use a specific name for this type, e.g. "size_t".
  397. Alias = Name;
  398. if (Ptr) {
  399. // If ArgType is actually a pointer to T, append an asterisk.
  400. Alias += (Alias[Alias.size()-1] == '*') ? "*" : " *";
  401. }
  402. // If Alias is the same as the underlying type, e.g. wchar_t, then drop it.
  403. if (S == Alias)
  404. Alias.clear();
  405. }
  406. if (!Alias.empty())
  407. return std::string("'") + Alias + "' (aka '" + S + "')";
  408. return std::string("'") + S + "'";
  409. }
  410. //===----------------------------------------------------------------------===//
  411. // Methods on OptionalAmount.
  412. //===----------------------------------------------------------------------===//
  413. ArgType
  414. analyze_format_string::OptionalAmount::getArgType(ASTContext &Ctx) const {
  415. return Ctx.IntTy;
  416. }
  417. //===----------------------------------------------------------------------===//
  418. // Methods on LengthModifier.
  419. //===----------------------------------------------------------------------===//
  420. const char *
  421. analyze_format_string::LengthModifier::toString() const {
  422. switch (kind) {
  423. case AsChar:
  424. return "hh";
  425. case AsShort:
  426. return "h";
  427. case AsLong: // or AsWideChar
  428. return "l";
  429. case AsLongLong:
  430. return "ll";
  431. case AsQuad:
  432. return "q";
  433. case AsIntMax:
  434. return "j";
  435. case AsSizeT:
  436. return "z";
  437. case AsPtrDiff:
  438. return "t";
  439. case AsInt32:
  440. return "I32";
  441. case AsInt3264:
  442. return "I";
  443. case AsInt64:
  444. return "I64";
  445. case AsLongDouble:
  446. return "L";
  447. case AsAllocate:
  448. return "a";
  449. case AsMAllocate:
  450. return "m";
  451. case AsWide:
  452. return "w";
  453. case None:
  454. return "";
  455. }
  456. return nullptr;
  457. }
  458. //===----------------------------------------------------------------------===//
  459. // Methods on ConversionSpecifier.
  460. //===----------------------------------------------------------------------===//
  461. const char *ConversionSpecifier::toString() const {
  462. switch (kind) {
  463. case dArg: return "d";
  464. case DArg: return "D";
  465. case iArg: return "i";
  466. case oArg: return "o";
  467. case OArg: return "O";
  468. case uArg: return "u";
  469. case UArg: return "U";
  470. case xArg: return "x";
  471. case XArg: return "X";
  472. case fArg: return "f";
  473. case FArg: return "F";
  474. case eArg: return "e";
  475. case EArg: return "E";
  476. case gArg: return "g";
  477. case GArg: return "G";
  478. case aArg: return "a";
  479. case AArg: return "A";
  480. case cArg: return "c";
  481. case sArg: return "s";
  482. case pArg: return "p";
  483. case nArg: return "n";
  484. case PercentArg: return "%";
  485. case ScanListArg: return "[";
  486. case InvalidSpecifier: return nullptr;
  487. // POSIX unicode extensions.
  488. case CArg: return "C";
  489. case SArg: return "S";
  490. // Objective-C specific specifiers.
  491. case ObjCObjArg: return "@";
  492. // FreeBSD kernel specific specifiers.
  493. case FreeBSDbArg: return "b";
  494. case FreeBSDDArg: return "D";
  495. case FreeBSDrArg: return "r";
  496. case FreeBSDyArg: return "y";
  497. // GlibC specific specifiers.
  498. case PrintErrno: return "m";
  499. // MS specific specifiers.
  500. case ZArg: return "Z";
  501. }
  502. return nullptr;
  503. }
  504. Optional<ConversionSpecifier>
  505. ConversionSpecifier::getStandardSpecifier() const {
  506. ConversionSpecifier::Kind NewKind;
  507. switch (getKind()) {
  508. default:
  509. return None;
  510. case DArg:
  511. NewKind = dArg;
  512. break;
  513. case UArg:
  514. NewKind = uArg;
  515. break;
  516. case OArg:
  517. NewKind = oArg;
  518. break;
  519. }
  520. ConversionSpecifier FixedCS(*this);
  521. FixedCS.setKind(NewKind);
  522. return FixedCS;
  523. }
  524. //===----------------------------------------------------------------------===//
  525. // Methods on OptionalAmount.
  526. //===----------------------------------------------------------------------===//
  527. void OptionalAmount::toString(raw_ostream &os) const {
  528. switch (hs) {
  529. case Invalid:
  530. case NotSpecified:
  531. return;
  532. case Arg:
  533. if (UsesDotPrefix)
  534. os << ".";
  535. if (usesPositionalArg())
  536. os << "*" << getPositionalArgIndex() << "$";
  537. else
  538. os << "*";
  539. break;
  540. case Constant:
  541. if (UsesDotPrefix)
  542. os << ".";
  543. os << amt;
  544. break;
  545. }
  546. }
  547. bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target) const {
  548. switch (LM.getKind()) {
  549. case LengthModifier::None:
  550. return true;
  551. // Handle most integer flags
  552. case LengthModifier::AsShort:
  553. if (Target.getTriple().isOSMSVCRT()) {
  554. switch (CS.getKind()) {
  555. case ConversionSpecifier::cArg:
  556. case ConversionSpecifier::CArg:
  557. case ConversionSpecifier::sArg:
  558. case ConversionSpecifier::SArg:
  559. case ConversionSpecifier::ZArg:
  560. return true;
  561. default:
  562. break;
  563. }
  564. }
  565. // Fall through.
  566. case LengthModifier::AsChar:
  567. case LengthModifier::AsLongLong:
  568. case LengthModifier::AsQuad:
  569. case LengthModifier::AsIntMax:
  570. case LengthModifier::AsSizeT:
  571. case LengthModifier::AsPtrDiff:
  572. switch (CS.getKind()) {
  573. case ConversionSpecifier::dArg:
  574. case ConversionSpecifier::DArg:
  575. case ConversionSpecifier::iArg:
  576. case ConversionSpecifier::oArg:
  577. case ConversionSpecifier::OArg:
  578. case ConversionSpecifier::uArg:
  579. case ConversionSpecifier::UArg:
  580. case ConversionSpecifier::xArg:
  581. case ConversionSpecifier::XArg:
  582. case ConversionSpecifier::nArg:
  583. return true;
  584. case ConversionSpecifier::FreeBSDrArg:
  585. case ConversionSpecifier::FreeBSDyArg:
  586. return Target.getTriple().isOSFreeBSD();
  587. default:
  588. return false;
  589. }
  590. // Handle 'l' flag
  591. case LengthModifier::AsLong: // or AsWideChar
  592. switch (CS.getKind()) {
  593. case ConversionSpecifier::dArg:
  594. case ConversionSpecifier::DArg:
  595. case ConversionSpecifier::iArg:
  596. case ConversionSpecifier::oArg:
  597. case ConversionSpecifier::OArg:
  598. case ConversionSpecifier::uArg:
  599. case ConversionSpecifier::UArg:
  600. case ConversionSpecifier::xArg:
  601. case ConversionSpecifier::XArg:
  602. case ConversionSpecifier::aArg:
  603. case ConversionSpecifier::AArg:
  604. case ConversionSpecifier::fArg:
  605. case ConversionSpecifier::FArg:
  606. case ConversionSpecifier::eArg:
  607. case ConversionSpecifier::EArg:
  608. case ConversionSpecifier::gArg:
  609. case ConversionSpecifier::GArg:
  610. case ConversionSpecifier::nArg:
  611. case ConversionSpecifier::cArg:
  612. case ConversionSpecifier::sArg:
  613. case ConversionSpecifier::ScanListArg:
  614. case ConversionSpecifier::ZArg:
  615. return true;
  616. case ConversionSpecifier::FreeBSDrArg:
  617. case ConversionSpecifier::FreeBSDyArg:
  618. return Target.getTriple().isOSFreeBSD();
  619. default:
  620. return false;
  621. }
  622. case LengthModifier::AsLongDouble:
  623. switch (CS.getKind()) {
  624. case ConversionSpecifier::aArg:
  625. case ConversionSpecifier::AArg:
  626. case ConversionSpecifier::fArg:
  627. case ConversionSpecifier::FArg:
  628. case ConversionSpecifier::eArg:
  629. case ConversionSpecifier::EArg:
  630. case ConversionSpecifier::gArg:
  631. case ConversionSpecifier::GArg:
  632. return true;
  633. // GNU libc extension.
  634. case ConversionSpecifier::dArg:
  635. case ConversionSpecifier::iArg:
  636. case ConversionSpecifier::oArg:
  637. case ConversionSpecifier::uArg:
  638. case ConversionSpecifier::xArg:
  639. case ConversionSpecifier::XArg:
  640. return !Target.getTriple().isOSDarwin() &&
  641. !Target.getTriple().isOSWindows();
  642. default:
  643. return false;
  644. }
  645. case LengthModifier::AsAllocate:
  646. switch (CS.getKind()) {
  647. case ConversionSpecifier::sArg:
  648. case ConversionSpecifier::SArg:
  649. case ConversionSpecifier::ScanListArg:
  650. return true;
  651. default:
  652. return false;
  653. }
  654. case LengthModifier::AsMAllocate:
  655. switch (CS.getKind()) {
  656. case ConversionSpecifier::cArg:
  657. case ConversionSpecifier::CArg:
  658. case ConversionSpecifier::sArg:
  659. case ConversionSpecifier::SArg:
  660. case ConversionSpecifier::ScanListArg:
  661. return true;
  662. default:
  663. return false;
  664. }
  665. case LengthModifier::AsInt32:
  666. case LengthModifier::AsInt3264:
  667. case LengthModifier::AsInt64:
  668. switch (CS.getKind()) {
  669. case ConversionSpecifier::dArg:
  670. case ConversionSpecifier::iArg:
  671. case ConversionSpecifier::oArg:
  672. case ConversionSpecifier::uArg:
  673. case ConversionSpecifier::xArg:
  674. case ConversionSpecifier::XArg:
  675. return Target.getTriple().isOSMSVCRT();
  676. default:
  677. return false;
  678. }
  679. case LengthModifier::AsWide:
  680. switch (CS.getKind()) {
  681. case ConversionSpecifier::cArg:
  682. case ConversionSpecifier::CArg:
  683. case ConversionSpecifier::sArg:
  684. case ConversionSpecifier::SArg:
  685. case ConversionSpecifier::ZArg:
  686. return Target.getTriple().isOSMSVCRT();
  687. default:
  688. return false;
  689. }
  690. }
  691. llvm_unreachable("Invalid LengthModifier Kind!");
  692. }
  693. bool FormatSpecifier::hasStandardLengthModifier() const {
  694. switch (LM.getKind()) {
  695. case LengthModifier::None:
  696. case LengthModifier::AsChar:
  697. case LengthModifier::AsShort:
  698. case LengthModifier::AsLong:
  699. case LengthModifier::AsLongLong:
  700. case LengthModifier::AsIntMax:
  701. case LengthModifier::AsSizeT:
  702. case LengthModifier::AsPtrDiff:
  703. case LengthModifier::AsLongDouble:
  704. return true;
  705. case LengthModifier::AsAllocate:
  706. case LengthModifier::AsMAllocate:
  707. case LengthModifier::AsQuad:
  708. case LengthModifier::AsInt32:
  709. case LengthModifier::AsInt3264:
  710. case LengthModifier::AsInt64:
  711. case LengthModifier::AsWide:
  712. return false;
  713. }
  714. llvm_unreachable("Invalid LengthModifier Kind!");
  715. }
  716. bool FormatSpecifier::hasStandardConversionSpecifier(
  717. const LangOptions &LangOpt) const {
  718. switch (CS.getKind()) {
  719. case ConversionSpecifier::cArg:
  720. case ConversionSpecifier::dArg:
  721. case ConversionSpecifier::iArg:
  722. case ConversionSpecifier::oArg:
  723. case ConversionSpecifier::uArg:
  724. case ConversionSpecifier::xArg:
  725. case ConversionSpecifier::XArg:
  726. case ConversionSpecifier::fArg:
  727. case ConversionSpecifier::FArg:
  728. case ConversionSpecifier::eArg:
  729. case ConversionSpecifier::EArg:
  730. case ConversionSpecifier::gArg:
  731. case ConversionSpecifier::GArg:
  732. case ConversionSpecifier::aArg:
  733. case ConversionSpecifier::AArg:
  734. case ConversionSpecifier::sArg:
  735. case ConversionSpecifier::pArg:
  736. case ConversionSpecifier::nArg:
  737. case ConversionSpecifier::ObjCObjArg:
  738. case ConversionSpecifier::ScanListArg:
  739. case ConversionSpecifier::PercentArg:
  740. return true;
  741. case ConversionSpecifier::CArg:
  742. case ConversionSpecifier::SArg:
  743. return LangOpt.ObjC1 || LangOpt.ObjC2;
  744. case ConversionSpecifier::InvalidSpecifier:
  745. case ConversionSpecifier::FreeBSDbArg:
  746. case ConversionSpecifier::FreeBSDDArg:
  747. case ConversionSpecifier::FreeBSDrArg:
  748. case ConversionSpecifier::FreeBSDyArg:
  749. case ConversionSpecifier::PrintErrno:
  750. case ConversionSpecifier::DArg:
  751. case ConversionSpecifier::OArg:
  752. case ConversionSpecifier::UArg:
  753. case ConversionSpecifier::ZArg:
  754. return false;
  755. }
  756. llvm_unreachable("Invalid ConversionSpecifier Kind!");
  757. }
  758. bool FormatSpecifier::hasStandardLengthConversionCombination() const {
  759. if (LM.getKind() == LengthModifier::AsLongDouble) {
  760. switch(CS.getKind()) {
  761. case ConversionSpecifier::dArg:
  762. case ConversionSpecifier::iArg:
  763. case ConversionSpecifier::oArg:
  764. case ConversionSpecifier::uArg:
  765. case ConversionSpecifier::xArg:
  766. case ConversionSpecifier::XArg:
  767. return false;
  768. default:
  769. return true;
  770. }
  771. }
  772. return true;
  773. }
  774. Optional<LengthModifier> FormatSpecifier::getCorrectedLengthModifier() const {
  775. if (CS.isAnyIntArg() || CS.getKind() == ConversionSpecifier::nArg) {
  776. if (LM.getKind() == LengthModifier::AsLongDouble ||
  777. LM.getKind() == LengthModifier::AsQuad) {
  778. LengthModifier FixedLM(LM);
  779. FixedLM.setKind(LengthModifier::AsLongLong);
  780. return FixedLM;
  781. }
  782. }
  783. return None;
  784. }
  785. bool FormatSpecifier::namedTypeToLengthModifier(QualType QT,
  786. LengthModifier &LM) {
  787. assert(isa<TypedefType>(QT) && "Expected a TypedefType");
  788. const TypedefNameDecl *Typedef = cast<TypedefType>(QT)->getDecl();
  789. for (;;) {
  790. const IdentifierInfo *Identifier = Typedef->getIdentifier();
  791. if (Identifier->getName() == "size_t") {
  792. LM.setKind(LengthModifier::AsSizeT);
  793. return true;
  794. } else if (Identifier->getName() == "ssize_t") {
  795. // Not C99, but common in Unix.
  796. LM.setKind(LengthModifier::AsSizeT);
  797. return true;
  798. } else if (Identifier->getName() == "intmax_t") {
  799. LM.setKind(LengthModifier::AsIntMax);
  800. return true;
  801. } else if (Identifier->getName() == "uintmax_t") {
  802. LM.setKind(LengthModifier::AsIntMax);
  803. return true;
  804. } else if (Identifier->getName() == "ptrdiff_t") {
  805. LM.setKind(LengthModifier::AsPtrDiff);
  806. return true;
  807. }
  808. QualType T = Typedef->getUnderlyingType();
  809. if (!isa<TypedefType>(T))
  810. break;
  811. Typedef = cast<TypedefType>(T)->getDecl();
  812. }
  813. return false;
  814. }