Skip to content

Commit de3d08f

Browse files
committed
When replacing a node’s child, make sure the new child doesn’t get pre-maturely deallocated
Previously, depending on the optimization level, when changing a nodes’s property, it could happen that `value` got de-allocated (because only `value.raw` was being accessed), deallocating the arena that `value.raw` lives in, resulting in freed memory access.
1 parent cbd0e6c commit de3d08f

File tree

9 files changed

+1721
-1711
lines changed

9 files changed

+1721
-1711
lines changed

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxNodesFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
173173
AccessorDeclSyntax(
174174
"""
175175
set(value) {
176-
self = \(node.kind.syntaxType)(data.replacingChild(at: \(raw: index), with: value\(raw: child.isOptional ? "?" : "").raw, arena: SyntaxArena()))
176+
self = \(node.kind.syntaxType)(data.replacingChild(at: \(raw: index), with: value\(raw: child.isOptional ? "?" : "").data, arena: SyntaxArena()))
177177
}
178178
"""
179179
)

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxRewriterFile.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,9 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
342342
/// a parent if `node` had one.
343343
public func rewrite(_ node: Syntax) -> Syntax {
344344
let rewritten = self.visit(node)
345-
let arena = SyntaxArena()
346-
return Syntax(node.data.replacingSelf(rewritten.raw, arena: arena))
345+
return withExtendedLifetime(rewritten) {
346+
return Syntax(node.data.replacingSelf(rewritten.raw, arena: rewritten.raw.arena))
347+
}
347348
}
348349
"""
349350
)

Sources/SwiftSyntax/SyntaxData.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,15 @@ struct SyntaxData {
336336
return replacingSelf(newRaw, arena: arena)
337337
}
338338

339+
/// Identical to `replacingChild(at: Int, with: RawSyntax?, arena: SyntaxArena)`
340+
/// that ensures that the arena of`newChild` doesn’t get de-allocated before
341+
/// `newChild` has been addded to the result.
342+
func replacingChild(at index: Int, with newChild: SyntaxData?, arena: SyntaxArena) -> SyntaxData {
343+
return withExtendedLifetime(newChild) {
344+
return replacingChild(at: index, with: newChild?.raw, arena: arena)
345+
}
346+
}
347+
339348
func withLeadingTrivia(_ leadingTrivia: Trivia, arena: SyntaxArena) -> SyntaxData {
340349
if let raw = raw.withLeadingTrivia(leadingTrivia, arena: arena) {
341350
return replacingSelf(raw, arena: arena)

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxDeclNodes.swift

Lines changed: 322 additions & 322 deletions
Large diffs are not rendered by default.

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxExprNodes.swift

Lines changed: 323 additions & 323 deletions
Large diffs are not rendered by default.

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodes.swift

Lines changed: 820 additions & 820 deletions
Large diffs are not rendered by default.

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxPatternNodes.swift

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public struct ExpressionPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
6363
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
6464
}
6565
set(value) {
66-
self = ExpressionPatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
66+
self = ExpressionPatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
6767
}
6868
}
6969

@@ -72,7 +72,7 @@ public struct ExpressionPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
7272
return ExprSyntax(data.child(at: 1, parent: Syntax(self))!)
7373
}
7474
set(value) {
75-
self = ExpressionPatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
75+
self = ExpressionPatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
7676
}
7777
}
7878

@@ -81,7 +81,7 @@ public struct ExpressionPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
8181
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
8282
}
8383
set(value) {
84-
self = ExpressionPatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
84+
self = ExpressionPatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
8585
}
8686
}
8787

@@ -141,7 +141,7 @@ public struct IdentifierPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
141141
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
142142
}
143143
set(value) {
144-
self = IdentifierPatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
144+
self = IdentifierPatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
145145
}
146146
}
147147

@@ -150,7 +150,7 @@ public struct IdentifierPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
150150
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
151151
}
152152
set(value) {
153-
self = IdentifierPatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
153+
self = IdentifierPatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
154154
}
155155
}
156156

@@ -159,7 +159,7 @@ public struct IdentifierPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
159159
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
160160
}
161161
set(value) {
162-
self = IdentifierPatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
162+
self = IdentifierPatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
163163
}
164164
}
165165

@@ -233,7 +233,7 @@ public struct IsTypePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
233233
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
234234
}
235235
set(value) {
236-
self = IsTypePatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
236+
self = IsTypePatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
237237
}
238238
}
239239

@@ -242,7 +242,7 @@ public struct IsTypePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
242242
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
243243
}
244244
set(value) {
245-
self = IsTypePatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
245+
self = IsTypePatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
246246
}
247247
}
248248

@@ -251,7 +251,7 @@ public struct IsTypePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
251251
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
252252
}
253253
set(value) {
254-
self = IsTypePatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
254+
self = IsTypePatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
255255
}
256256
}
257257

@@ -260,7 +260,7 @@ public struct IsTypePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
260260
return TypeSyntax(data.child(at: 3, parent: Syntax(self))!)
261261
}
262262
set(value) {
263-
self = IsTypePatternSyntax(data.replacingChild(at: 3, with: value.raw, arena: SyntaxArena()))
263+
self = IsTypePatternSyntax(data.replacingChild(at: 3, with: value.data, arena: SyntaxArena()))
264264
}
265265
}
266266

@@ -269,7 +269,7 @@ public struct IsTypePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
269269
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
270270
}
271271
set(value) {
272-
self = IsTypePatternSyntax(data.replacingChild(at: 4, with: value?.raw, arena: SyntaxArena()))
272+
self = IsTypePatternSyntax(data.replacingChild(at: 4, with: value?.data, arena: SyntaxArena()))
273273
}
274274
}
275275

@@ -335,7 +335,7 @@ public struct MissingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
335335
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
336336
}
337337
set(value) {
338-
self = MissingPatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
338+
self = MissingPatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
339339
}
340340
}
341341

@@ -345,7 +345,7 @@ public struct MissingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
345345
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
346346
}
347347
set(value) {
348-
self = MissingPatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
348+
self = MissingPatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
349349
}
350350
}
351351

@@ -354,7 +354,7 @@ public struct MissingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
354354
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
355355
}
356356
set(value) {
357-
self = MissingPatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
357+
self = MissingPatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
358358
}
359359
}
360360

@@ -434,7 +434,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
434434
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
435435
}
436436
set(value) {
437-
self = TuplePatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
437+
self = TuplePatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
438438
}
439439
}
440440

@@ -443,7 +443,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
443443
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
444444
}
445445
set(value) {
446-
self = TuplePatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
446+
self = TuplePatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
447447
}
448448
}
449449

@@ -452,7 +452,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
452452
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
453453
}
454454
set(value) {
455-
self = TuplePatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
455+
self = TuplePatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
456456
}
457457
}
458458

@@ -461,7 +461,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
461461
return TuplePatternElementListSyntax(data.child(at: 3, parent: Syntax(self))!)
462462
}
463463
set(value) {
464-
self = TuplePatternSyntax(data.replacingChild(at: 3, with: value.raw, arena: SyntaxArena()))
464+
self = TuplePatternSyntax(data.replacingChild(at: 3, with: value.data, arena: SyntaxArena()))
465465
}
466466
}
467467

@@ -489,7 +489,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
489489
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
490490
}
491491
set(value) {
492-
self = TuplePatternSyntax(data.replacingChild(at: 4, with: value?.raw, arena: SyntaxArena()))
492+
self = TuplePatternSyntax(data.replacingChild(at: 4, with: value?.data, arena: SyntaxArena()))
493493
}
494494
}
495495

@@ -498,7 +498,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
498498
return TokenSyntax(data.child(at: 5, parent: Syntax(self))!)
499499
}
500500
set(value) {
501-
self = TuplePatternSyntax(data.replacingChild(at: 5, with: value.raw, arena: SyntaxArena()))
501+
self = TuplePatternSyntax(data.replacingChild(at: 5, with: value.data, arena: SyntaxArena()))
502502
}
503503
}
504504

@@ -507,7 +507,7 @@ public struct TuplePatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
507507
return data.child(at: 6, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
508508
}
509509
set(value) {
510-
self = TuplePatternSyntax(data.replacingChild(at: 6, with: value?.raw, arena: SyntaxArena()))
510+
self = TuplePatternSyntax(data.replacingChild(at: 6, with: value?.data, arena: SyntaxArena()))
511511
}
512512
}
513513

@@ -589,7 +589,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
589589
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
590590
}
591591
set(value) {
592-
self = ValueBindingPatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
592+
self = ValueBindingPatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
593593
}
594594
}
595595

@@ -598,7 +598,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
598598
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
599599
}
600600
set(value) {
601-
self = ValueBindingPatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
601+
self = ValueBindingPatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
602602
}
603603
}
604604

@@ -607,7 +607,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
607607
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
608608
}
609609
set(value) {
610-
self = ValueBindingPatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
610+
self = ValueBindingPatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
611611
}
612612
}
613613

@@ -616,7 +616,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
616616
return PatternSyntax(data.child(at: 3, parent: Syntax(self))!)
617617
}
618618
set(value) {
619-
self = ValueBindingPatternSyntax(data.replacingChild(at: 3, with: value.raw, arena: SyntaxArena()))
619+
self = ValueBindingPatternSyntax(data.replacingChild(at: 3, with: value.data, arena: SyntaxArena()))
620620
}
621621
}
622622

@@ -625,7 +625,7 @@ public struct ValueBindingPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
625625
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
626626
}
627627
set(value) {
628-
self = ValueBindingPatternSyntax(data.replacingChild(at: 4, with: value?.raw, arena: SyntaxArena()))
628+
self = ValueBindingPatternSyntax(data.replacingChild(at: 4, with: value?.data, arena: SyntaxArena()))
629629
}
630630
}
631631

@@ -705,7 +705,7 @@ public struct WildcardPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
705705
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
706706
}
707707
set(value) {
708-
self = WildcardPatternSyntax(data.replacingChild(at: 0, with: value?.raw, arena: SyntaxArena()))
708+
self = WildcardPatternSyntax(data.replacingChild(at: 0, with: value?.data, arena: SyntaxArena()))
709709
}
710710
}
711711

@@ -714,7 +714,7 @@ public struct WildcardPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
714714
return TokenSyntax(data.child(at: 1, parent: Syntax(self))!)
715715
}
716716
set(value) {
717-
self = WildcardPatternSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
717+
self = WildcardPatternSyntax(data.replacingChild(at: 1, with: value.data, arena: SyntaxArena()))
718718
}
719719
}
720720

@@ -723,7 +723,7 @@ public struct WildcardPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
723723
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
724724
}
725725
set(value) {
726-
self = WildcardPatternSyntax(data.replacingChild(at: 2, with: value?.raw, arena: SyntaxArena()))
726+
self = WildcardPatternSyntax(data.replacingChild(at: 2, with: value?.data, arena: SyntaxArena()))
727727
}
728728
}
729729

@@ -732,7 +732,7 @@ public struct WildcardPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
732732
return data.child(at: 3, parent: Syntax(self)).map(TypeAnnotationSyntax.init)
733733
}
734734
set(value) {
735-
self = WildcardPatternSyntax(data.replacingChild(at: 3, with: value?.raw, arena: SyntaxArena()))
735+
self = WildcardPatternSyntax(data.replacingChild(at: 3, with: value?.data, arena: SyntaxArena()))
736736
}
737737
}
738738

@@ -741,7 +741,7 @@ public struct WildcardPatternSyntax: PatternSyntaxProtocol, SyntaxHashable {
741741
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
742742
}
743743
set(value) {
744-
self = WildcardPatternSyntax(data.replacingChild(at: 4, with: value?.raw, arena: SyntaxArena()))
744+
self = WildcardPatternSyntax(data.replacingChild(at: 4, with: value?.data, arena: SyntaxArena()))
745745
}
746746
}
747747

0 commit comments

Comments
 (0)