PrintfFormatString.cpp 33 KB

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