27 using namespace clang;
34 const char *&Beg,
const char *E) {
36 const char *start = I - 1;
54 if (I + 1 != E && I[0] ==
'^' && I[1] ==
']') {
83 using namespace clang::analyze_scanf;
85 const char *Start =
nullptr;
89 for ( ; I != E ; ++I) {
124 FS.setSuppressAssignment(I);
134 if (Amt.getHowSpecified() != OptionalAmount::NotSpecified) {
135 assert(Amt.getHowSpecified() == OptionalAmount::Constant);
136 FS.setFieldWidth(Amt);
159 const char *conversionPosition = I++;
161 switch (*conversionPosition) {
164 case '%': k = ConversionSpecifier::PercentArg;
break;
165 case 'A': k = ConversionSpecifier::AArg;
break;
166 case 'E': k = ConversionSpecifier::EArg;
break;
167 case 'F': k = ConversionSpecifier::FArg;
break;
168 case 'G': k = ConversionSpecifier::GArg;
break;
169 case 'X': k = ConversionSpecifier::XArg;
break;
170 case 'a': k = ConversionSpecifier::aArg;
break;
171 case 'd': k = ConversionSpecifier::dArg;
break;
172 case 'e': k = ConversionSpecifier::eArg;
break;
173 case 'f': k = ConversionSpecifier::fArg;
break;
174 case 'g': k = ConversionSpecifier::gArg;
break;
175 case 'i': k = ConversionSpecifier::iArg;
break;
176 case 'n': k = ConversionSpecifier::nArg;
break;
177 case 'c': k = ConversionSpecifier::cArg;
break;
178 case 'C': k = ConversionSpecifier::CArg;
break;
179 case 'S': k = ConversionSpecifier::SArg;
break;
180 case '[': k = ConversionSpecifier::ScanListArg;
break;
181 case 'u': k = ConversionSpecifier::uArg;
break;
182 case 'x': k = ConversionSpecifier::xArg;
break;
183 case 'o': k = ConversionSpecifier::oArg;
break;
184 case 's': k = ConversionSpecifier::sArg;
break;
185 case 'p': k = ConversionSpecifier::pArg;
break;
190 k = ConversionSpecifier::DArg;
194 k = ConversionSpecifier::OArg;
198 k = ConversionSpecifier::UArg;
206 FS.setConversionSpecifier(CS);
208 && !FS.usesPositionalArg())
209 FS.setArgIndex(argIndex++);
225 return ArgType::Invalid();
229 case ConversionSpecifier::dArg:
230 case ConversionSpecifier::DArg:
231 case ConversionSpecifier::iArg:
232 switch (LM.getKind()) {
234 return ArgType::PtrTo(Ctx.
IntTy);
235 case LengthModifier::AsChar:
236 return ArgType::PtrTo(ArgType::AnyCharTy);
237 case LengthModifier::AsShort:
238 return ArgType::PtrTo(Ctx.
ShortTy);
239 case LengthModifier::AsLong:
240 return ArgType::PtrTo(Ctx.
LongTy);
241 case LengthModifier::AsLongLong:
242 case LengthModifier::AsQuad:
244 case LengthModifier::AsInt64:
245 return ArgType::PtrTo(ArgType(Ctx.
LongLongTy,
"__int64"));
246 case LengthModifier::AsIntMax:
247 return ArgType::PtrTo(ArgType(Ctx.
getIntMaxType(),
"intmax_t"));
248 case LengthModifier::AsSizeT:
251 case LengthModifier::AsPtrDiff:
253 case LengthModifier::AsLongDouble:
256 case LengthModifier::AsAllocate:
257 case LengthModifier::AsMAllocate:
258 case LengthModifier::AsInt32:
259 case LengthModifier::AsInt3264:
260 case LengthModifier::AsWide:
261 return ArgType::Invalid();
265 case ConversionSpecifier::oArg:
266 case ConversionSpecifier::OArg:
267 case ConversionSpecifier::uArg:
268 case ConversionSpecifier::UArg:
269 case ConversionSpecifier::xArg:
270 case ConversionSpecifier::XArg:
271 switch (LM.getKind()) {
274 case LengthModifier::AsChar:
276 case LengthModifier::AsShort:
278 case LengthModifier::AsLong:
280 case LengthModifier::AsLongLong:
281 case LengthModifier::AsQuad:
283 case LengthModifier::AsInt64:
285 case LengthModifier::AsIntMax:
286 return ArgType::PtrTo(ArgType(Ctx.
getUIntMaxType(),
"uintmax_t"));
287 case LengthModifier::AsSizeT:
288 return ArgType::PtrTo(ArgType(Ctx.
getSizeType(),
"size_t"));
289 case LengthModifier::AsPtrDiff:
292 case LengthModifier::AsLongDouble:
295 case LengthModifier::AsAllocate:
296 case LengthModifier::AsMAllocate:
297 case LengthModifier::AsInt32:
298 case LengthModifier::AsInt3264:
299 case LengthModifier::AsWide:
300 return ArgType::Invalid();
304 case ConversionSpecifier::aArg:
305 case ConversionSpecifier::AArg:
306 case ConversionSpecifier::eArg:
307 case ConversionSpecifier::EArg:
308 case ConversionSpecifier::fArg:
309 case ConversionSpecifier::FArg:
310 case ConversionSpecifier::gArg:
311 case ConversionSpecifier::GArg:
312 switch (LM.getKind()) {
314 return ArgType::PtrTo(Ctx.
FloatTy);
315 case LengthModifier::AsLong:
316 return ArgType::PtrTo(Ctx.
DoubleTy);
317 case LengthModifier::AsLongDouble:
320 return ArgType::Invalid();
324 case ConversionSpecifier::cArg:
325 case ConversionSpecifier::sArg:
326 case ConversionSpecifier::ScanListArg:
327 switch (LM.getKind()) {
329 return ArgType::PtrTo(ArgType::AnyCharTy);
330 case LengthModifier::AsLong:
331 case LengthModifier::AsWide:
333 case LengthModifier::AsAllocate:
334 case LengthModifier::AsMAllocate:
335 return ArgType::PtrTo(ArgType::CStrTy);
336 case LengthModifier::AsShort:
338 return ArgType::PtrTo(ArgType::AnyCharTy);
340 return ArgType::Invalid();
342 case ConversionSpecifier::CArg:
343 case ConversionSpecifier::SArg:
345 switch (LM.getKind()) {
347 case LengthModifier::AsWide:
349 case LengthModifier::AsAllocate:
350 case LengthModifier::AsMAllocate:
351 return ArgType::PtrTo(ArgType(ArgType::WCStrTy,
"wchar_t *"));
352 case LengthModifier::AsShort:
354 return ArgType::PtrTo(ArgType::AnyCharTy);
356 return ArgType::Invalid();
360 case ConversionSpecifier::pArg:
361 return ArgType::PtrTo(ArgType::CPointerTy);
364 case ConversionSpecifier::nArg:
365 switch (LM.getKind()) {
367 return ArgType::PtrTo(Ctx.
IntTy);
368 case LengthModifier::AsChar:
370 case LengthModifier::AsShort:
371 return ArgType::PtrTo(Ctx.
ShortTy);
372 case LengthModifier::AsLong:
373 return ArgType::PtrTo(Ctx.
LongTy);
374 case LengthModifier::AsLongLong:
375 case LengthModifier::AsQuad:
377 case LengthModifier::AsInt64:
378 return ArgType::PtrTo(ArgType(Ctx.
LongLongTy,
"__int64"));
379 case LengthModifier::AsIntMax:
380 return ArgType::PtrTo(ArgType(Ctx.
getIntMaxType(),
"intmax_t"));
381 case LengthModifier::AsSizeT:
383 case LengthModifier::AsPtrDiff:
385 case LengthModifier::AsLongDouble:
387 case LengthModifier::AsAllocate:
388 case LengthModifier::AsMAllocate:
389 case LengthModifier::AsInt32:
390 case LengthModifier::AsInt3264:
391 case LengthModifier::AsWide:
392 return ArgType::Invalid();
407 if (CS.getKind() == ConversionSpecifier::nArg)
417 PT = ETy->getDecl()->getIntegerType();
425 CS.setKind(ConversionSpecifier::sArg);
427 LM.setKind(LengthModifier::AsWideChar);
434 FieldWidth = OptionalAmount(OptionalAmount::Constant,
435 CAT->getSize().getZExtValue() - 1,
445 case BuiltinType::UInt:
446 case BuiltinType::Int:
447 case BuiltinType::Float:
452 case BuiltinType::Char_U:
453 case BuiltinType::UChar:
454 case BuiltinType::Char_S:
455 case BuiltinType::SChar:
456 LM.setKind(LengthModifier::AsChar);
460 case BuiltinType::Short:
461 case BuiltinType::UShort:
462 LM.setKind(LengthModifier::AsShort);
466 case BuiltinType::Long:
467 case BuiltinType::ULong:
468 case BuiltinType::Double:
469 LM.setKind(LengthModifier::AsLong);
473 case BuiltinType::LongLong:
474 case BuiltinType::ULongLong:
475 LM.setKind(LengthModifier::AsLongLong);
479 case BuiltinType::LongDouble:
480 LM.setKind(LengthModifier::AsLongDouble);
489 if (isa<TypedefType>(PT) && (LangOpt.C99 || LangOpt.CPlusPlus11))
490 namedTypeToLengthModifier(PT, LM);
494 const analyze_scanf::ArgType &AT = getArgType(Ctx);
495 if (AT.isValid() && AT.matchesType(Ctx, QT))
501 CS.setKind(ConversionSpecifier::fArg);
503 CS.setKind(ConversionSpecifier::dArg);
505 CS.setKind(ConversionSpecifier::uArg);
507 llvm_unreachable(
"Unexpected type");
515 if (usesPositionalArg())
516 os << getPositionalArgIndex() <<
"$";
517 if (SuppressAssignment)
520 FieldWidth.toString(os);
531 unsigned argIndex = 0;
551 assert(I == E &&
"Format string not exhausted");
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
const TargetInfo & getTargetInfo() const
bool isUnsignedIntegerType() const
CanQualType UnsignedCharTy
QualType getPointeeType() const
bool isRealFloatingType() const
Floating point categories.
Exposes information about the current target.
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
void setEndScanList(const char *pos)
QualType getWideCharType() const
Return the type of wide characters. In C++, this returns the unique wchar_t type. In C99...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType UnsignedShortTy
CanQualType UnsignedLongLongTy
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool isWideCharType() const
std::string toString(const til::SExpr *E)
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>. Pointer - pointer requires t...
CanQualType UnsignedLongTy
Defines the clang::TargetInfo interface.
bool isSignedIntegerType() const
CanQualType UnsignedIntTy
bool isPointerType() const