PrintfFormatString.cpp 31 KB

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