Skip to content

Commit eb1c93d

Browse files
author
Endre Fülöp
committed
Implement basic type lookup
1 parent faffbca commit eb1c93d

File tree

2 files changed

+45
-31
lines changed

2 files changed

+45
-31
lines changed

clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,48 +1457,62 @@ std::string Option{"Config"};
14571457
Mgr->getAnalyzerOptions().getCheckerStringOption(this, Option);*/
14581458
StringRef ConfigFile = "/local/workspace/llvm-project/clang/test/Analysis/Inputs/fread-summary.yaml";
14591459
llvm::Optional<SummaryConfiguration> Config =
1460-
getConfiguration<SummaryConfiguration>(*Mgr, this, Option, ConfigFile);
1461-
llvm::errs()<<"Config :"<<Config.hasValue()<<"\n";
1462-
if (Config.has_value()){
1463-
for (const SummaryConfiguration::Summary &s : Config->summaries){
1464-
llvm::errs()<<"Config :"<<s.name<<"\n";
1465-
1466-
ArgTypes args;
1467-
for (const std::string &t: s.signature.argTypes){
1468-
auto ltype = lookupTy(t);
1469-
if (ltype.has_value()){
1470-
llvm::errs()<<"type string:"<<t<<"\n";
1471-
ltype->dump();
1472-
args.push_back(lookupTy(t));
1473-
}
1460+
getConfiguration<SummaryConfiguration>(*Mgr, this, Option, ConfigFile);
1461+
llvm::errs() << "Config :" << Config.has_value() << "\n";
1462+
1463+
auto GetTypeFromStr = [&](StringRef TypeName) {
1464+
Optional<QualType> LType = lookupTy(TypeName);
1465+
if (LType)
1466+
return *LType;
1467+
1468+
return llvm::StringSwitch<QualType>(TypeName)
1469+
.Case("void *", VoidPtrTy)
1470+
.Case("void * restrict", VoidPtrRestrictTy)
1471+
.Default(Irrelevant);
1472+
};
1473+
1474+
if (Config.has_value()) {
1475+
for (const SummaryConfiguration::Summary &s : Config->summaries) {
1476+
ArgTypes Args;
1477+
for (const std::string &TypeName : s.signature.argTypes) {
1478+
llvm::errs() << "arg type string:" << TypeName << "\n";
1479+
QualType Type = GetTypeFromStr(TypeName);
1480+
llvm::errs() << "arg type dump:";
1481+
Type.dump();
1482+
llvm::errs() << "\n";
1483+
1484+
Args.push_back(Type);
14741485
}
1475-
RetType rt = lookupTy(s.signature.returnType);
1476-
auto GetSummary = [s]() {
1486+
1487+
const std::string &RetTypeName = s.signature.returnType;
1488+
llvm::errs() << "ret type string:" << RetTypeName << "\n";
1489+
QualType RetType = GetTypeFromStr(RetTypeName);
1490+
llvm::errs() << "ret type dump:";
1491+
1492+
auto GetSummary = [&s]() {
14771493
switch (s.evaluationType) {
14781494
case SummaryConfiguration::EvaluationType::NoEvalCall:
14791495
return Summary(NoEvalCall);
14801496
case SummaryConfiguration::EvaluationType::EvalCallAsPure:
14811497
return Summary(EvalCallAsPure);
14821498
}
14831499
};
1500+
14841501
Summary summary = GetSummary();
14851502

1486-
for (const SummaryConfiguration::ArgConstraint &ac: s.argConstraints){
1487-
switch (ac.type){
1488-
case SummaryConfiguration::ArgConstraintType::NotNull:
1489-
summary.ArgConstraint(NotNull(ac.arg));
1490-
break;
1491-
case SummaryConfiguration::ArgConstraintType::BufferSize:
1492-
summary.ArgConstraint(BufferSize(ac.bufferArg,ac.sizeArg, ac.countArg));
1493-
break;
1503+
for (const SummaryConfiguration::ArgConstraint &AC : s.argConstraints) {
1504+
switch (AC.type) {
1505+
case SummaryConfiguration::ArgConstraintType::NotNull:
1506+
summary.ArgConstraint(NotNull(AC.arg));
1507+
break;
1508+
case SummaryConfiguration::ArgConstraintType::BufferSize:
1509+
summary.ArgConstraint(
1510+
BufferSize(AC.bufferArg, AC.sizeArg, AC.countArg));
1511+
break;
14941512
}
14951513
}
14961514

1497-
addToFunctionSummaryMap(
1498-
s.name,
1499-
Signature(args,
1500-
rt),
1501-
summary);
1515+
addToFunctionSummaryMap(s.name, Signature(Args, RetType), summary);
15021516
}
15031517
}
15041518
/*

clang/test/Analysis/Inputs/fread-summary.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Summaries:
44
- Name: "fread"
55
Signature:
66
ArgTypes:
7+
- "void*"
78
- "size_t"
89
- "size_t"
9-
- "size_t"
10-
- "FILE *restrict"
10+
- "FILE*"
1111
RetType: "size_t"
1212
EvaluationType: "NoEvalCall"
1313
ArgConstraints: # We give an error if this is violated

0 commit comments

Comments
 (0)