PrintfFormatString.cpp 34 KB

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