PrintfFormatString.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942
  1. //== PrintfFormatString.cpp - Analysis of printf format strings --*- 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. // Handling of format string in printf and friends. The structure of format
  11. // strings for fprintf() are described in C99 7.19.6.1.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Analysis/Analyses/FormatString.h"
  15. #include "FormatStringParsing.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::LengthModifier;
  20. using clang::analyze_format_string::OptionalAmount;
  21. using clang::analyze_format_string::ConversionSpecifier;
  22. using clang::analyze_printf::PrintfSpecifier;
  23. using namespace clang;
  24. typedef clang::analyze_format_string::SpecifierResult<PrintfSpecifier>
  25. PrintfSpecifierResult;
  26. //===----------------------------------------------------------------------===//
  27. // Methods for parsing format strings.
  28. //===----------------------------------------------------------------------===//
  29. using analyze_format_string::ParseNonPositionAmount;
  30. static bool ParsePrecision(FormatStringHandler &H, PrintfSpecifier &FS,
  31. const char *Start, const char *&Beg, const char *E,
  32. unsigned *argIndex) {
  33. if (argIndex) {
  34. FS.setPrecision(ParseNonPositionAmount(Beg, E, *argIndex));
  35. } else {
  36. const OptionalAmount Amt = ParsePositionAmount(H, Start, Beg, E,
  37. analyze_format_string::PrecisionPos);
  38. if (Amt.isInvalid())
  39. return true;
  40. FS.setPrecision(Amt);
  41. }
  42. return false;
  43. }
  44. static bool ParseObjCFlags(FormatStringHandler &H, PrintfSpecifier &FS,
  45. const char *FlagBeg, const char *E, bool Warn) {
  46. StringRef Flag(FlagBeg, E - FlagBeg);
  47. // Currently there is only one flag.
  48. if (Flag == "tt") {
  49. FS.setHasObjCTechnicalTerm(FlagBeg);
  50. return false;
  51. }
  52. // Handle either the case of no flag or an invalid flag.
  53. if (Warn) {
  54. if (Flag == "")
  55. H.HandleEmptyObjCModifierFlag(FlagBeg, E - FlagBeg);
  56. else
  57. H.HandleInvalidObjCModifierFlag(FlagBeg, E - FlagBeg);
  58. }
  59. return true;
  60. }
  61. static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H,
  62. const char *&Beg,
  63. const char *E,
  64. unsigned &argIndex,
  65. const LangOptions &LO,
  66. const TargetInfo &Target,
  67. bool Warn,
  68. bool isFreeBSDKPrintf) {
  69. using namespace clang::analyze_format_string;
  70. using namespace clang::analyze_printf;
  71. const char *I = Beg;
  72. const char *Start = nullptr;
  73. UpdateOnReturn <const char*> UpdateBeg(Beg, I);
  74. // Look for a '%' character that indicates the start of a format specifier.
  75. for ( ; I != E ; ++I) {
  76. char c = *I;
  77. if (c == '\0') {
  78. // Detect spurious null characters, which are likely errors.
  79. H.HandleNullChar(I);
  80. return true;
  81. }
  82. if (c == '%') {
  83. Start = I++; // Record the start of the format specifier.
  84. break;
  85. }
  86. }
  87. // No format specifier found?
  88. if (!Start)
  89. return false;
  90. if (I == E) {
  91. // No more characters left?
  92. if (Warn)
  93. H.HandleIncompleteSpecifier(Start, E - Start);
  94. return true;
  95. }
  96. PrintfSpecifier FS;
  97. if (ParseArgPosition(H, FS, Start, I, E))
  98. return true;
  99. if (I == E) {
  100. // No more characters left?
  101. if (Warn)
  102. H.HandleIncompleteSpecifier(Start, E - Start);
  103. return true;
  104. }
  105. // Look for flags (if any).
  106. bool hasMore = true;
  107. for ( ; I != E; ++I) {
  108. switch (*I) {
  109. default: hasMore = false; break;
  110. case '\'':
  111. // FIXME: POSIX specific. Always accept?
  112. FS.setHasThousandsGrouping(I);
  113. break;
  114. case '-': FS.setIsLeftJustified(I); break;
  115. case '+': FS.setHasPlusPrefix(I); break;
  116. case ' ': FS.setHasSpacePrefix(I); break;
  117. case '#': FS.setHasAlternativeForm(I); break;
  118. case '0': FS.setHasLeadingZeros(I); break;
  119. }
  120. if (!hasMore)
  121. break;
  122. }
  123. if (I == E) {
  124. // No more characters left?
  125. if (Warn)
  126. H.HandleIncompleteSpecifier(Start, E - Start);
  127. return true;
  128. }
  129. // Look for the field width (if any).
  130. if (ParseFieldWidth(H, FS, Start, I, E,
  131. FS.usesPositionalArg() ? nullptr : &argIndex))
  132. return true;
  133. if (I == E) {
  134. // No more characters left?
  135. if (Warn)
  136. H.HandleIncompleteSpecifier(Start, E - Start);
  137. return true;
  138. }
  139. // Look for the precision (if any).
  140. if (*I == '.') {
  141. ++I;
  142. if (I == E) {
  143. if (Warn)
  144. H.HandleIncompleteSpecifier(Start, E - Start);
  145. return true;
  146. }
  147. if (ParsePrecision(H, FS, Start, I, E,
  148. FS.usesPositionalArg() ? nullptr : &argIndex))
  149. return true;
  150. if (I == E) {
  151. // No more characters left?
  152. if (Warn)
  153. H.HandleIncompleteSpecifier(Start, E - Start);
  154. return true;
  155. }
  156. }
  157. // Look for the length modifier.
  158. if (ParseLengthModifier(FS, I, E, LO) && I == E) {
  159. // No more characters left?
  160. if (Warn)
  161. H.HandleIncompleteSpecifier(Start, E - Start);
  162. return true;
  163. }
  164. // Look for the Objective-C modifier flags, if any.
  165. // We parse these here, even if they don't apply to
  166. // the conversion specifier, and then emit an error
  167. // later if the conversion specifier isn't '@'. This
  168. // enables better recovery, and we don't know if
  169. // these flags are applicable until later.
  170. const char *ObjCModifierFlagsStart = nullptr,
  171. *ObjCModifierFlagsEnd = nullptr;
  172. if (*I == '[') {
  173. ObjCModifierFlagsStart = I;
  174. ++I;
  175. auto flagStart = I;
  176. for (;; ++I) {
  177. ObjCModifierFlagsEnd = I;
  178. if (I == E) {
  179. if (Warn)
  180. H.HandleIncompleteSpecifier(Start, E - Start);
  181. return true;
  182. }
  183. // Did we find the closing ']'?
  184. if (*I == ']') {
  185. if (ParseObjCFlags(H, FS, flagStart, I, Warn))
  186. return true;
  187. ++I;
  188. break;
  189. }
  190. // There are no separators defined yet for multiple
  191. // Objective-C modifier flags. When those are
  192. // defined, this is the place to check.
  193. }
  194. }
  195. if (*I == '\0') {
  196. // Detect spurious null characters, which are likely errors.
  197. H.HandleNullChar(I);
  198. return true;
  199. }
  200. // Finally, look for the conversion specifier.
  201. const char *conversionPosition = I++;
  202. ConversionSpecifier::Kind k = ConversionSpecifier::InvalidSpecifier;
  203. switch (*conversionPosition) {
  204. default:
  205. break;
  206. // C99: 7.19.6.1 (section 8).
  207. case '%': k = ConversionSpecifier::PercentArg; break;
  208. case 'A': k = ConversionSpecifier::AArg; break;
  209. case 'E': k = ConversionSpecifier::EArg; break;
  210. case 'F': k = ConversionSpecifier::FArg; break;
  211. case 'G': k = ConversionSpecifier::GArg; break;
  212. case 'X': k = ConversionSpecifier::XArg; break;
  213. case 'a': k = ConversionSpecifier::aArg; break;
  214. case 'c': k = ConversionSpecifier::cArg; break;
  215. case 'd': k = ConversionSpecifier::dArg; break;
  216. case 'e': k = ConversionSpecifier::eArg; break;
  217. case 'f': k = ConversionSpecifier::fArg; break;
  218. case 'g': k = ConversionSpecifier::gArg; break;
  219. case 'i': k = ConversionSpecifier::iArg; break;
  220. case 'n': k = ConversionSpecifier::nArg; break;
  221. case 'o': k = ConversionSpecifier::oArg; break;
  222. case 'p': k = ConversionSpecifier::pArg; break;
  223. case 's': k = ConversionSpecifier::sArg; break;
  224. case 'u': k = ConversionSpecifier::uArg; break;
  225. case 'x': k = ConversionSpecifier::xArg; break;
  226. // POSIX specific.
  227. case 'C': k = ConversionSpecifier::CArg; break;
  228. case 'S': k = ConversionSpecifier::SArg; break;
  229. // Objective-C.
  230. case '@': k = ConversionSpecifier::ObjCObjArg; break;
  231. // Glibc specific.
  232. case 'm': k = ConversionSpecifier::PrintErrno; break;
  233. // FreeBSD kernel specific.
  234. case 'b':
  235. if (isFreeBSDKPrintf)
  236. k = ConversionSpecifier::FreeBSDbArg; // int followed by char *
  237. break;
  238. case 'r':
  239. if (isFreeBSDKPrintf)
  240. k = ConversionSpecifier::FreeBSDrArg; // int
  241. break;
  242. case 'y':
  243. if (isFreeBSDKPrintf)
  244. k = ConversionSpecifier::FreeBSDyArg; // int
  245. break;
  246. // Apple-specific.
  247. case 'D':
  248. if (isFreeBSDKPrintf)
  249. k = ConversionSpecifier::FreeBSDDArg; // void * followed by char *
  250. else if (Target.getTriple().isOSDarwin())
  251. k = ConversionSpecifier::DArg;
  252. break;
  253. case 'O':
  254. if (Target.getTriple().isOSDarwin())
  255. k = ConversionSpecifier::OArg;
  256. break;
  257. case 'U':
  258. if (Target.getTriple().isOSDarwin())
  259. k = ConversionSpecifier::UArg;
  260. break;
  261. // MS specific.
  262. case 'Z':
  263. if (Target.getTriple().isOSMSVCRT())
  264. k = ConversionSpecifier::ZArg;
  265. }
  266. // Check to see if we used the Objective-C modifier flags with
  267. // a conversion specifier other than '@'.
  268. if (k != ConversionSpecifier::ObjCObjArg &&
  269. k != ConversionSpecifier::InvalidSpecifier &&
  270. ObjCModifierFlagsStart) {
  271. H.HandleObjCFlagsWithNonObjCConversion(ObjCModifierFlagsStart,
  272. ObjCModifierFlagsEnd + 1,
  273. conversionPosition);
  274. return true;
  275. }
  276. PrintfConversionSpecifier CS(conversionPosition, k);
  277. FS.setConversionSpecifier(CS);
  278. if (CS.consumesDataArgument() && !FS.usesPositionalArg())
  279. FS.setArgIndex(argIndex++);
  280. // FreeBSD kernel specific.
  281. if (k == ConversionSpecifier::FreeBSDbArg ||
  282. k == ConversionSpecifier::FreeBSDDArg)
  283. argIndex++;
  284. if (k == ConversionSpecifier::InvalidSpecifier) {
  285. unsigned Len = I - Start;
  286. if (ParseUTF8InvalidSpecifier(Start, E, Len)) {
  287. CS.setEndScanList(Start + Len);
  288. FS.setConversionSpecifier(CS);
  289. }
  290. // Assume the conversion takes one argument.
  291. return !H.HandleInvalidPrintfConversionSpecifier(FS, Start, Len);
  292. }
  293. return PrintfSpecifierResult(Start, FS);
  294. }
  295. bool clang::analyze_format_string::ParsePrintfString(FormatStringHandler &H,
  296. const char *I,
  297. const char *E,
  298. const LangOptions &LO,
  299. const TargetInfo &Target,
  300. bool isFreeBSDKPrintf) {
  301. unsigned argIndex = 0;
  302. // Keep looking for a format specifier until we have exhausted the string.
  303. while (I != E) {
  304. const PrintfSpecifierResult &FSR = ParsePrintfSpecifier(H, I, E, argIndex,
  305. LO, Target, true,
  306. isFreeBSDKPrintf);
  307. // Did a fail-stop error of any kind occur when parsing the specifier?
  308. // If so, don't do any more processing.
  309. if (FSR.shouldStop())
  310. return true;
  311. // Did we exhaust the string or encounter an error that
  312. // we can recover from?
  313. if (!FSR.hasValue())
  314. continue;
  315. // We have a format specifier. Pass it to the callback.
  316. if (!H.HandlePrintfSpecifier(FSR.getValue(), FSR.getStart(),
  317. I - FSR.getStart()))
  318. return true;
  319. }
  320. assert(I == E && "Format string not exhausted");
  321. return false;
  322. }
  323. bool clang::analyze_format_string::ParseFormatStringHasSArg(const char *I,
  324. const char *E,
  325. const LangOptions &LO,
  326. const TargetInfo &Target) {
  327. unsigned argIndex = 0;
  328. // Keep looking for a %s format specifier until we have exhausted the string.
  329. FormatStringHandler H;
  330. while (I != E) {
  331. const PrintfSpecifierResult &FSR = ParsePrintfSpecifier(H, I, E, argIndex,
  332. LO, Target, false,
  333. false);
  334. // Did a fail-stop error of any kind occur when parsing the specifier?
  335. // If so, don't do any more processing.
  336. if (FSR.shouldStop())
  337. return false;
  338. // Did we exhaust the string or encounter an error that
  339. // we can recover from?
  340. if (!FSR.hasValue())
  341. continue;
  342. const analyze_printf::PrintfSpecifier &FS = FSR.getValue();
  343. // Return true if this a %s format specifier.
  344. if (FS.getConversionSpecifier().getKind() == ConversionSpecifier::Kind::sArg)
  345. return true;
  346. }
  347. return false;
  348. }
  349. //===----------------------------------------------------------------------===//
  350. // Methods on PrintfSpecifier.
  351. //===----------------------------------------------------------------------===//
  352. ArgType PrintfSpecifier::getArgType(ASTContext &Ctx,
  353. bool IsObjCLiteral) const {
  354. const PrintfConversionSpecifier &CS = getConversionSpecifier();
  355. if (!CS.consumesDataArgument())
  356. return ArgType::Invalid();
  357. if (CS.getKind() == ConversionSpecifier::cArg)
  358. switch (LM.getKind()) {
  359. case LengthModifier::None:
  360. return Ctx.IntTy;
  361. case LengthModifier::AsLong:
  362. case LengthModifier::AsWide:
  363. return ArgType(ArgType::WIntTy, "wint_t");
  364. case LengthModifier::AsShort:
  365. if (Ctx.getTargetInfo().getTriple().isOSMSVCRT())
  366. return Ctx.IntTy;
  367. default:
  368. return ArgType::Invalid();
  369. }
  370. if (CS.isIntArg())
  371. switch (LM.getKind()) {
  372. case LengthModifier::AsLongDouble:
  373. // GNU extension.
  374. return Ctx.LongLongTy;
  375. case LengthModifier::None:
  376. return Ctx.IntTy;
  377. case LengthModifier::AsInt32:
  378. return ArgType(Ctx.IntTy, "__int32");
  379. case LengthModifier::AsChar: return ArgType::AnyCharTy;
  380. case LengthModifier::AsShort: return Ctx.ShortTy;
  381. case LengthModifier::AsLong: return Ctx.LongTy;
  382. case LengthModifier::AsLongLong:
  383. case LengthModifier::AsQuad:
  384. return Ctx.LongLongTy;
  385. case LengthModifier::AsInt64:
  386. return ArgType(Ctx.LongLongTy, "__int64");
  387. case LengthModifier::AsIntMax:
  388. return ArgType(Ctx.getIntMaxType(), "intmax_t");
  389. case LengthModifier::AsSizeT:
  390. // FIXME: How to get the corresponding signed version of size_t?
  391. return ArgType();
  392. case LengthModifier::AsInt3264:
  393. return Ctx.getTargetInfo().getTriple().isArch64Bit()
  394. ? ArgType(Ctx.LongLongTy, "__int64")
  395. : ArgType(Ctx.IntTy, "__int32");
  396. case LengthModifier::AsPtrDiff:
  397. return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t");
  398. case LengthModifier::AsAllocate:
  399. case LengthModifier::AsMAllocate:
  400. case LengthModifier::AsWide:
  401. return ArgType::Invalid();
  402. }
  403. if (CS.isUIntArg())
  404. switch (LM.getKind()) {
  405. case LengthModifier::AsLongDouble:
  406. // GNU extension.
  407. return Ctx.UnsignedLongLongTy;
  408. case LengthModifier::None:
  409. return Ctx.UnsignedIntTy;
  410. case LengthModifier::AsInt32:
  411. return ArgType(Ctx.UnsignedIntTy, "unsigned __int32");
  412. case LengthModifier::AsChar: return Ctx.UnsignedCharTy;
  413. case LengthModifier::AsShort: return Ctx.UnsignedShortTy;
  414. case LengthModifier::AsLong: return Ctx.UnsignedLongTy;
  415. case LengthModifier::AsLongLong:
  416. case LengthModifier::AsQuad:
  417. return Ctx.UnsignedLongLongTy;
  418. case LengthModifier::AsInt64:
  419. return ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64");
  420. case LengthModifier::AsIntMax:
  421. return ArgType(Ctx.getUIntMaxType(), "uintmax_t");
  422. case LengthModifier::AsSizeT:
  423. return ArgType(Ctx.getSizeType(), "size_t");
  424. case LengthModifier::AsInt3264:
  425. return Ctx.getTargetInfo().getTriple().isArch64Bit()
  426. ? ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64")
  427. : ArgType(Ctx.UnsignedIntTy, "unsigned __int32");
  428. case LengthModifier::AsPtrDiff:
  429. // FIXME: How to get the corresponding unsigned
  430. // version of ptrdiff_t?
  431. return ArgType();
  432. case LengthModifier::AsAllocate:
  433. case LengthModifier::AsMAllocate:
  434. case LengthModifier::AsWide:
  435. return ArgType::Invalid();
  436. }
  437. if (CS.isDoubleArg()) {
  438. if (LM.getKind() == LengthModifier::AsLongDouble)
  439. return Ctx.LongDoubleTy;
  440. return Ctx.DoubleTy;
  441. }
  442. if (CS.getKind() == ConversionSpecifier::nArg) {
  443. switch (LM.getKind()) {
  444. case LengthModifier::None:
  445. return ArgType::PtrTo(Ctx.IntTy);
  446. case LengthModifier::AsChar:
  447. return ArgType::PtrTo(Ctx.SignedCharTy);
  448. case LengthModifier::AsShort:
  449. return ArgType::PtrTo(Ctx.ShortTy);
  450. case LengthModifier::AsLong:
  451. return ArgType::PtrTo(Ctx.LongTy);
  452. case LengthModifier::AsLongLong:
  453. case LengthModifier::AsQuad:
  454. return ArgType::PtrTo(Ctx.LongLongTy);
  455. case LengthModifier::AsIntMax:
  456. return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), "intmax_t"));
  457. case LengthModifier::AsSizeT:
  458. return ArgType(); // FIXME: ssize_t
  459. case LengthModifier::AsPtrDiff:
  460. return ArgType::PtrTo(ArgType(Ctx.getPointerDiffType(), "ptrdiff_t"));
  461. case LengthModifier::AsLongDouble:
  462. return ArgType(); // FIXME: Is this a known extension?
  463. case LengthModifier::AsAllocate:
  464. case LengthModifier::AsMAllocate:
  465. case LengthModifier::AsInt32:
  466. case LengthModifier::AsInt3264:
  467. case LengthModifier::AsInt64:
  468. case LengthModifier::AsWide:
  469. return ArgType::Invalid();
  470. }
  471. }
  472. switch (CS.getKind()) {
  473. case ConversionSpecifier::sArg:
  474. if (LM.getKind() == LengthModifier::AsWideChar) {
  475. if (IsObjCLiteral)
  476. return ArgType(Ctx.getPointerType(Ctx.UnsignedShortTy.withConst()),
  477. "const unichar *");
  478. return ArgType(ArgType::WCStrTy, "wchar_t *");
  479. }
  480. if (LM.getKind() == LengthModifier::AsWide)
  481. return ArgType(ArgType::WCStrTy, "wchar_t *");
  482. return ArgType::CStrTy;
  483. case ConversionSpecifier::SArg:
  484. if (IsObjCLiteral)
  485. return ArgType(Ctx.getPointerType(Ctx.UnsignedShortTy.withConst()),
  486. "const unichar *");
  487. if (Ctx.getTargetInfo().getTriple().isOSMSVCRT() &&
  488. LM.getKind() == LengthModifier::AsShort)
  489. return ArgType::CStrTy;
  490. return ArgType(ArgType::WCStrTy, "wchar_t *");
  491. case ConversionSpecifier::CArg:
  492. if (IsObjCLiteral)
  493. return ArgType(Ctx.UnsignedShortTy, "unichar");
  494. if (Ctx.getTargetInfo().getTriple().isOSMSVCRT() &&
  495. LM.getKind() == LengthModifier::AsShort)
  496. return Ctx.IntTy;
  497. return ArgType(Ctx.WideCharTy, "wchar_t");
  498. case ConversionSpecifier::pArg:
  499. return ArgType::CPointerTy;
  500. case ConversionSpecifier::ObjCObjArg:
  501. return ArgType::ObjCPointerTy;
  502. default:
  503. break;
  504. }
  505. // FIXME: Handle other cases.
  506. return ArgType();
  507. }
  508. bool PrintfSpecifier::fixType(QualType QT, const LangOptions &LangOpt,
  509. ASTContext &Ctx, bool IsObjCLiteral) {
  510. // %n is different from other conversion specifiers; don't try to fix it.
  511. if (CS.getKind() == ConversionSpecifier::nArg)
  512. return false;
  513. // Handle Objective-C objects first. Note that while the '%@' specifier will
  514. // not warn for structure pointer or void pointer arguments (because that's
  515. // how CoreFoundation objects are implemented), we only show a fixit for '%@'
  516. // if we know it's an object (block, id, class, or __attribute__((NSObject))).
  517. if (QT->isObjCRetainableType()) {
  518. if (!IsObjCLiteral)
  519. return false;
  520. CS.setKind(ConversionSpecifier::ObjCObjArg);
  521. // Disable irrelevant flags
  522. HasThousandsGrouping = false;
  523. HasPlusPrefix = false;
  524. HasSpacePrefix = false;
  525. HasAlternativeForm = false;
  526. HasLeadingZeroes = false;
  527. Precision.setHowSpecified(OptionalAmount::NotSpecified);
  528. LM.setKind(LengthModifier::None);
  529. return true;
  530. }
  531. // Handle strings next (char *, wchar_t *)
  532. if (QT->isPointerType() && (QT->getPointeeType()->isAnyCharacterType())) {
  533. CS.setKind(ConversionSpecifier::sArg);
  534. // Disable irrelevant flags
  535. HasAlternativeForm = 0;
  536. HasLeadingZeroes = 0;
  537. // Set the long length modifier for wide characters
  538. if (QT->getPointeeType()->isWideCharType())
  539. LM.setKind(LengthModifier::AsWideChar);
  540. else
  541. LM.setKind(LengthModifier::None);
  542. return true;
  543. }
  544. // If it's an enum, get its underlying type.
  545. if (const EnumType *ETy = QT->getAs<EnumType>())
  546. QT = ETy->getDecl()->getIntegerType();
  547. // We can only work with builtin types.
  548. const BuiltinType *BT = QT->getAs<BuiltinType>();
  549. if (!BT)
  550. return false;
  551. // Set length modifier
  552. switch (BT->getKind()) {
  553. case BuiltinType::Bool:
  554. case BuiltinType::WChar_U:
  555. case BuiltinType::WChar_S:
  556. case BuiltinType::Char16:
  557. case BuiltinType::Char32:
  558. case BuiltinType::UInt128:
  559. case BuiltinType::Int128:
  560. case BuiltinType::Half:
  561. // Various types which are non-trivial to correct.
  562. return false;
  563. #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
  564. case BuiltinType::Id:
  565. #include "clang/Basic/OpenCLImageTypes.def"
  566. #define SIGNED_TYPE(Id, SingletonId)
  567. #define UNSIGNED_TYPE(Id, SingletonId)
  568. #define FLOATING_TYPE(Id, SingletonId)
  569. #define BUILTIN_TYPE(Id, SingletonId) \
  570. case BuiltinType::Id:
  571. #include "clang/AST/BuiltinTypes.def"
  572. // Misc other stuff which doesn't make sense here.
  573. return false;
  574. case BuiltinType::UInt:
  575. case BuiltinType::Int:
  576. case BuiltinType::Float:
  577. case BuiltinType::Double:
  578. LM.setKind(LengthModifier::None);
  579. break;
  580. case BuiltinType::Char_U:
  581. case BuiltinType::UChar:
  582. case BuiltinType::Char_S:
  583. case BuiltinType::SChar:
  584. LM.setKind(LengthModifier::AsChar);
  585. break;
  586. case BuiltinType::Short:
  587. case BuiltinType::UShort:
  588. LM.setKind(LengthModifier::AsShort);
  589. break;
  590. case BuiltinType::Long:
  591. case BuiltinType::ULong:
  592. LM.setKind(LengthModifier::AsLong);
  593. break;
  594. case BuiltinType::LongLong:
  595. case BuiltinType::ULongLong:
  596. LM.setKind(LengthModifier::AsLongLong);
  597. break;
  598. case BuiltinType::LongDouble:
  599. LM.setKind(LengthModifier::AsLongDouble);
  600. break;
  601. }
  602. // Handle size_t, ptrdiff_t, etc. that have dedicated length modifiers in C99.
  603. if (isa<TypedefType>(QT) && (LangOpt.C99 || LangOpt.CPlusPlus11))
  604. namedTypeToLengthModifier(QT, LM);
  605. // If fixing the length modifier was enough, we might be done.
  606. if (hasValidLengthModifier(Ctx.getTargetInfo())) {
  607. // If we're going to offer a fix anyway, make sure the sign matches.
  608. switch (CS.getKind()) {
  609. case ConversionSpecifier::uArg:
  610. case ConversionSpecifier::UArg:
  611. if (QT->isSignedIntegerType())
  612. CS.setKind(clang::analyze_format_string::ConversionSpecifier::dArg);
  613. break;
  614. case ConversionSpecifier::dArg:
  615. case ConversionSpecifier::DArg:
  616. case ConversionSpecifier::iArg:
  617. if (QT->isUnsignedIntegerType() && !HasPlusPrefix)
  618. CS.setKind(clang::analyze_format_string::ConversionSpecifier::uArg);
  619. break;
  620. default:
  621. // Other specifiers do not have signed/unsigned variants.
  622. break;
  623. }
  624. const analyze_printf::ArgType &ATR = getArgType(Ctx, IsObjCLiteral);
  625. if (ATR.isValid() && ATR.matchesType(Ctx, QT))
  626. return true;
  627. }
  628. // Set conversion specifier and disable any flags which do not apply to it.
  629. // Let typedefs to char fall through to int, as %c is silly for uint8_t.
  630. if (!isa<TypedefType>(QT) && QT->isCharType()) {
  631. CS.setKind(ConversionSpecifier::cArg);
  632. LM.setKind(LengthModifier::None);
  633. Precision.setHowSpecified(OptionalAmount::NotSpecified);
  634. HasAlternativeForm = 0;
  635. HasLeadingZeroes = 0;
  636. HasPlusPrefix = 0;
  637. }
  638. // Test for Floating type first as LongDouble can pass isUnsignedIntegerType
  639. else if (QT->isRealFloatingType()) {
  640. CS.setKind(ConversionSpecifier::fArg);
  641. }
  642. else if (QT->isSignedIntegerType()) {
  643. CS.setKind(ConversionSpecifier::dArg);
  644. HasAlternativeForm = 0;
  645. }
  646. else if (QT->isUnsignedIntegerType()) {
  647. CS.setKind(ConversionSpecifier::uArg);
  648. HasAlternativeForm = 0;
  649. HasPlusPrefix = 0;
  650. } else {
  651. llvm_unreachable("Unexpected type");
  652. }
  653. return true;
  654. }
  655. void PrintfSpecifier::toString(raw_ostream &os) const {
  656. // Whilst some features have no defined order, we are using the order
  657. // appearing in the C99 standard (ISO/IEC 9899:1999 (E) 7.19.6.1)
  658. os << "%";
  659. // Positional args
  660. if (usesPositionalArg()) {
  661. os << getPositionalArgIndex() << "$";
  662. }
  663. // Conversion flags
  664. if (IsLeftJustified) os << "-";
  665. if (HasPlusPrefix) os << "+";
  666. if (HasSpacePrefix) os << " ";
  667. if (HasAlternativeForm) os << "#";
  668. if (HasLeadingZeroes) os << "0";
  669. // Minimum field width
  670. FieldWidth.toString(os);
  671. // Precision
  672. Precision.toString(os);
  673. // Length modifier
  674. os << LM.toString();
  675. // Conversion specifier
  676. os << CS.toString();
  677. }
  678. bool PrintfSpecifier::hasValidPlusPrefix() const {
  679. if (!HasPlusPrefix)
  680. return true;
  681. // The plus prefix only makes sense for signed conversions
  682. switch (CS.getKind()) {
  683. case ConversionSpecifier::dArg:
  684. case ConversionSpecifier::DArg:
  685. case ConversionSpecifier::iArg:
  686. case ConversionSpecifier::fArg:
  687. case ConversionSpecifier::FArg:
  688. case ConversionSpecifier::eArg:
  689. case ConversionSpecifier::EArg:
  690. case ConversionSpecifier::gArg:
  691. case ConversionSpecifier::GArg:
  692. case ConversionSpecifier::aArg:
  693. case ConversionSpecifier::AArg:
  694. case ConversionSpecifier::FreeBSDrArg:
  695. case ConversionSpecifier::FreeBSDyArg:
  696. return true;
  697. default:
  698. return false;
  699. }
  700. }
  701. bool PrintfSpecifier::hasValidAlternativeForm() const {
  702. if (!HasAlternativeForm)
  703. return true;
  704. // Alternate form flag only valid with the oxXaAeEfFgG conversions
  705. switch (CS.getKind()) {
  706. case ConversionSpecifier::oArg:
  707. case ConversionSpecifier::OArg:
  708. case ConversionSpecifier::xArg:
  709. case ConversionSpecifier::XArg:
  710. case ConversionSpecifier::aArg:
  711. case ConversionSpecifier::AArg:
  712. case ConversionSpecifier::eArg:
  713. case ConversionSpecifier::EArg:
  714. case ConversionSpecifier::fArg:
  715. case ConversionSpecifier::FArg:
  716. case ConversionSpecifier::gArg:
  717. case ConversionSpecifier::GArg:
  718. case ConversionSpecifier::FreeBSDrArg:
  719. case ConversionSpecifier::FreeBSDyArg:
  720. return true;
  721. default:
  722. return false;
  723. }
  724. }
  725. bool PrintfSpecifier::hasValidLeadingZeros() const {
  726. if (!HasLeadingZeroes)
  727. return true;
  728. // Leading zeroes flag only valid with the diouxXaAeEfFgG conversions
  729. switch (CS.getKind()) {
  730. case ConversionSpecifier::dArg:
  731. case ConversionSpecifier::DArg:
  732. case ConversionSpecifier::iArg:
  733. case ConversionSpecifier::oArg:
  734. case ConversionSpecifier::OArg:
  735. case ConversionSpecifier::uArg:
  736. case ConversionSpecifier::UArg:
  737. case ConversionSpecifier::xArg:
  738. case ConversionSpecifier::XArg:
  739. case ConversionSpecifier::aArg:
  740. case ConversionSpecifier::AArg:
  741. case ConversionSpecifier::eArg:
  742. case ConversionSpecifier::EArg:
  743. case ConversionSpecifier::fArg:
  744. case ConversionSpecifier::FArg:
  745. case ConversionSpecifier::gArg:
  746. case ConversionSpecifier::GArg:
  747. case ConversionSpecifier::FreeBSDrArg:
  748. case ConversionSpecifier::FreeBSDyArg:
  749. return true;
  750. default:
  751. return false;
  752. }
  753. }
  754. bool PrintfSpecifier::hasValidSpacePrefix() const {
  755. if (!HasSpacePrefix)
  756. return true;
  757. // The space prefix only makes sense for signed conversions
  758. switch (CS.getKind()) {
  759. case ConversionSpecifier::dArg:
  760. case ConversionSpecifier::DArg:
  761. case ConversionSpecifier::iArg:
  762. case ConversionSpecifier::fArg:
  763. case ConversionSpecifier::FArg:
  764. case ConversionSpecifier::eArg:
  765. case ConversionSpecifier::EArg:
  766. case ConversionSpecifier::gArg:
  767. case ConversionSpecifier::GArg:
  768. case ConversionSpecifier::aArg:
  769. case ConversionSpecifier::AArg:
  770. case ConversionSpecifier::FreeBSDrArg:
  771. case ConversionSpecifier::FreeBSDyArg:
  772. return true;
  773. default:
  774. return false;
  775. }
  776. }
  777. bool PrintfSpecifier::hasValidLeftJustified() const {
  778. if (!IsLeftJustified)
  779. return true;
  780. // The left justified flag is valid for all conversions except n
  781. switch (CS.getKind()) {
  782. case ConversionSpecifier::nArg:
  783. return false;
  784. default:
  785. return true;
  786. }
  787. }
  788. bool PrintfSpecifier::hasValidThousandsGroupingPrefix() const {
  789. if (!HasThousandsGrouping)
  790. return true;
  791. switch (CS.getKind()) {
  792. case ConversionSpecifier::dArg:
  793. case ConversionSpecifier::DArg:
  794. case ConversionSpecifier::iArg:
  795. case ConversionSpecifier::uArg:
  796. case ConversionSpecifier::UArg:
  797. case ConversionSpecifier::fArg:
  798. case ConversionSpecifier::FArg:
  799. case ConversionSpecifier::gArg:
  800. case ConversionSpecifier::GArg:
  801. return true;
  802. default:
  803. return false;
  804. }
  805. }
  806. bool PrintfSpecifier::hasValidPrecision() const {
  807. if (Precision.getHowSpecified() == OptionalAmount::NotSpecified)
  808. return true;
  809. // Precision is only valid with the diouxXaAeEfFgGs conversions
  810. switch (CS.getKind()) {
  811. case ConversionSpecifier::dArg:
  812. case ConversionSpecifier::DArg:
  813. case ConversionSpecifier::iArg:
  814. case ConversionSpecifier::oArg:
  815. case ConversionSpecifier::OArg:
  816. case ConversionSpecifier::uArg:
  817. case ConversionSpecifier::UArg:
  818. case ConversionSpecifier::xArg:
  819. case ConversionSpecifier::XArg:
  820. case ConversionSpecifier::aArg:
  821. case ConversionSpecifier::AArg:
  822. case ConversionSpecifier::eArg:
  823. case ConversionSpecifier::EArg:
  824. case ConversionSpecifier::fArg:
  825. case ConversionSpecifier::FArg:
  826. case ConversionSpecifier::gArg:
  827. case ConversionSpecifier::GArg:
  828. case ConversionSpecifier::sArg:
  829. case ConversionSpecifier::FreeBSDrArg:
  830. case ConversionSpecifier::FreeBSDyArg:
  831. return true;
  832. default:
  833. return false;
  834. }
  835. }
  836. bool PrintfSpecifier::hasValidFieldWidth() const {
  837. if (FieldWidth.getHowSpecified() == OptionalAmount::NotSpecified)
  838. return true;
  839. // The field width is valid for all conversions except n
  840. switch (CS.getKind()) {
  841. case ConversionSpecifier::nArg:
  842. return false;
  843. default:
  844. return true;
  845. }
  846. }