PrintfFormatString.cpp 35 KB

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