Skip to content

Commit 61bb6c9

Browse files
committed
Swift: replace or remove assertions in translators
Assertions before fetching a non optional label are not needed as the dispatcher will replace those with unspecified elements (and properly log those instances).
1 parent df84ed5 commit 61bb6c9

File tree

8 files changed

+27
-16
lines changed

8 files changed

+27
-16
lines changed

swift/extractor/translators/DeclTranslator.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ std::optional<codeql::ParamDecl> DeclTranslator::translateParamDecl(const swift:
9797
codeql::TopLevelCodeDecl DeclTranslator::translateTopLevelCodeDecl(
9898
const swift::TopLevelCodeDecl& decl) {
9999
auto entry = createEntry(decl);
100-
assert(decl.getBody() && "Expect top level code to have body");
101100
entry.body = dispatcher.fetchLabel(decl.getBody());
102101
return entry;
103102
}
@@ -107,7 +106,6 @@ codeql::PatternBindingDecl DeclTranslator::translatePatternBindingDecl(
107106
auto entry = createEntry(decl);
108107
for (unsigned i = 0; i < decl.getNumPatternEntries(); ++i) {
109108
auto pattern = decl.getPattern(i);
110-
assert(pattern && "Expect pattern binding decl to have all patterns");
111109
entry.patterns.push_back(dispatcher.fetchLabel(pattern));
112110
entry.inits.push_back(dispatcher.fetchOptionalLabel(decl.getInit(i)));
113111
}
@@ -309,9 +307,10 @@ std::string DeclTranslator::mangledName(const swift::ValueDecl& decl) {
309307

310308
void DeclTranslator::fillAbstractFunctionDecl(const swift::AbstractFunctionDecl& decl,
311309
codeql::AbstractFunctionDecl& entry) {
312-
assert(decl.hasParameterList() && "Expect functions to have a parameter list");
313310
entry.name = !decl.hasName() ? "(unnamed function decl)" : constructName(decl.getName());
314311
entry.body = dispatcher.fetchOptionalLabel(decl.getBody());
312+
CODEQL_EXPECT_OR(return, decl.hasParameterList(), "Function {} has no parameter list",
313+
entry.name);
315314
entry.params = dispatcher.fetchRepeatedLabels(*decl.getParameters());
316315
auto self = const_cast<swift::ParamDecl* const>(decl.getImplicitSelfDecl());
317316
entry.self_param = dispatcher.fetchOptionalLabel(self);
@@ -378,7 +377,6 @@ void DeclTranslator::fillGenericContext(const swift::GenericContext& decl,
378377
}
379378

380379
void DeclTranslator::fillValueDecl(const swift::ValueDecl& decl, codeql::ValueDecl& entry) {
381-
assert(decl.getInterfaceType() && "Expect ValueDecl to have InterfaceType");
382380
entry.interface_type = dispatcher.fetchLabel(decl.getInterfaceType());
383381
}
384382

swift/extractor/translators/DeclTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ namespace codeql {
1515
// "forward declarations" while our extraction is incomplete
1616
class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
1717
public:
18+
static constexpr std::string_view name = "decl";
19+
1820
using AstTranslatorBase<DeclTranslator>::AstTranslatorBase;
1921

2022
std::optional<codeql::ConcreteFuncDecl> translateFuncDecl(const swift::FuncDecl& decl);

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,11 @@ codeql::IsExpr ExprTranslator::translateIsExpr(const swift::IsExpr& expr) {
355355
codeql::SubscriptExpr ExprTranslator::translateSubscriptExpr(const swift::SubscriptExpr& expr) {
356356
auto entry = createExprEntry(expr);
357357
fillAccessorSemantics(expr, entry);
358-
assert(expr.getArgs() && "SubscriptExpr has getArgs");
358+
fillLookupExpr(expr, entry);
359+
CODEQL_EXPECT_OR(return entry, expr.getArgs(), "SubscriptExpr has null getArgs");
359360
for (const auto& arg : *expr.getArgs()) {
360361
entry.arguments.push_back(emitArgument(arg));
361362
}
362-
fillLookupExpr(expr, entry);
363363
return entry;
364364
}
365365

@@ -384,9 +384,10 @@ codeql::KeyPathExpr ExprTranslator::translateKeyPathExpr(const swift::KeyPathExp
384384
}
385385
if (auto rootTypeRepr = expr.getRootType()) {
386386
auto keyPathType = expr.getType()->getAs<swift::BoundGenericClassType>();
387-
assert(keyPathType && "KeyPathExpr must have BoundGenericClassType");
387+
CODEQL_EXPECT_OR(return entry, keyPathType, "KeyPathExpr must have BoundGenericClassType");
388388
auto keyPathTypeArgs = keyPathType->getGenericArgs();
389-
assert(keyPathTypeArgs.size() != 0 && "KeyPathExpr type must have generic args");
389+
CODEQL_EXPECT_OR(return entry, keyPathTypeArgs.size() != 0,
390+
"KeyPathExpr type must have generic args");
390391
entry.root = dispatcher.fetchLabel(rootTypeRepr, keyPathTypeArgs[0]);
391392
}
392393
}
@@ -474,10 +475,10 @@ codeql::ErrorExpr ExprTranslator::translateErrorExpr(const swift::ErrorExpr& exp
474475

475476
void ExprTranslator::fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,
476477
codeql::AbstractClosureExpr& entry) {
477-
assert(expr.getParameters() && "AbstractClosureExpr has getParameters()");
478-
entry.params = dispatcher.fetchRepeatedLabels(*expr.getParameters());
479478
entry.body = dispatcher.fetchLabel(expr.getBody());
480479
entry.captures = dispatcher.fetchRepeatedLabels(expr.getCaptureInfo().getCaptures());
480+
CODEQL_EXPECT_OR(return, expr.getParameters(), "AbstractClosureExpr has null getParameters()");
481+
entry.params = dispatcher.fetchRepeatedLabels(*expr.getParameters());
481482
}
482483

483484
TrapLabel<ArgumentTag> ExprTranslator::emitArgument(const swift::Argument& arg) {
@@ -524,7 +525,7 @@ void ExprTranslator::fillAnyTryExpr(const swift::AnyTryExpr& expr, codeql::AnyTr
524525

525526
void ExprTranslator::fillApplyExpr(const swift::ApplyExpr& expr, codeql::ApplyExpr& entry) {
526527
entry.function = dispatcher.fetchLabel(expr.getFn());
527-
assert(expr.getArgs() && "ApplyExpr has getArgs");
528+
CODEQL_EXPECT_OR(return, expr.getArgs(), "ApplyExpr has null getArgs");
528529
for (const auto& arg : *expr.getArgs()) {
529530
entry.arguments.push_back(emitArgument(arg));
530531
}

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace codeql {
77

88
class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
99
public:
10+
static constexpr std::string_view name = "expr";
11+
1012
using AstTranslatorBase<ExprTranslator>::AstTranslatorBase;
1113

1214
codeql::IntegerLiteralExpr translateIntegerLiteralExpr(const swift::IntegerLiteralExpr& expr);

swift/extractor/translators/PatternTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace codeql {
77

88
class PatternTranslator : public AstTranslatorBase<PatternTranslator> {
99
public:
10+
static constexpr std::string_view name = "pattern";
11+
1012
using AstTranslatorBase<PatternTranslator>::AstTranslatorBase;
1113

1214
codeql::NamedPattern translateNamedPattern(const swift::NamedPattern& pattern);

swift/extractor/translators/StmtTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace codeql {
77

88
class StmtTranslator : public AstTranslatorBase<StmtTranslator> {
99
public:
10+
static constexpr std::string_view name = "stmt";
11+
1012
using AstTranslatorBase<StmtTranslator>::AstTranslatorBase;
1113
using AstTranslatorBase<StmtTranslator>::translateAndEmit;
1214

swift/extractor/translators/TranslatorBase.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ namespace detail {
1111
class TranslatorBase {
1212
protected:
1313
SwiftDispatcher& dispatcher;
14+
Logger logger;
1415

15-
public:
1616
// SwiftDispatcher should outlive this instance
17-
TranslatorBase(SwiftDispatcher& dispatcher) : dispatcher{dispatcher} {}
17+
TranslatorBase(SwiftDispatcher& dispatcher, std::string_view name)
18+
: dispatcher{dispatcher}, logger{"translator/" + std::string(name)} {}
1819
};
1920

2021
// define by macro metaprogramming member checkers
@@ -90,7 +91,7 @@ enum class TranslatorPolicy {
9091
void visit##CLASS##KIND(swift::CLASS##KIND* e) { \
9192
constexpr auto policy = getPolicyFor##CLASS##KIND(); \
9293
if constexpr (policy == TranslatorPolicy::ignore) { \
93-
std::cerr << "Unexpected " #CLASS #KIND "\n"; \
94+
LOG_ERROR("Unexpected " #CLASS #KIND); \
9495
return; \
9596
} else if constexpr (policy == TranslatorPolicy::translate) { \
9697
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translate##CLASS##KIND(*e)); \
@@ -108,7 +109,7 @@ template <typename CrtpSubclass>
108109
class AstTranslatorBase : private swift::ASTVisitor<CrtpSubclass>,
109110
protected detail::TranslatorBase {
110111
public:
111-
using TranslatorBase::TranslatorBase;
112+
AstTranslatorBase(SwiftDispatcher& dispatcher) : TranslatorBase(dispatcher, CrtpSubclass::name) {}
112113

113114
// swift does not provide const visitors. The following const_cast is safe, as we privately
114115
// route the visit to translateXXX functions only if they take const references to swift
@@ -145,7 +146,8 @@ template <typename CrtpSubclass>
145146
class TypeTranslatorBase : private swift::TypeVisitor<CrtpSubclass>,
146147
protected detail::TranslatorBase {
147148
public:
148-
using TranslatorBase::TranslatorBase;
149+
TypeTranslatorBase(SwiftDispatcher& dispatcher)
150+
: TranslatorBase(dispatcher, CrtpSubclass::name) {}
149151

150152
// swift does not provide const visitors. The following const_cast is safe, as we privately
151153
// route the visit to translateXXX functions only if they take const references to swift

swift/extractor/translators/TypeTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
namespace codeql {
88
class TypeTranslator : public TypeTranslatorBase<TypeTranslator> {
99
public:
10+
static constexpr std::string_view name = "type";
11+
1012
using TypeTranslatorBase<TypeTranslator>::TypeTranslatorBase;
1113
using TypeTranslatorBase<TypeTranslator>::translateAndEmit;
1214

0 commit comments

Comments
 (0)