PrintfFormatString.cpp 36 KB

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