Skip to content

AttributedSubstring.== crashes on empty strings #4634

Closed
@cobbal

Description

@cobbal

When comparing 2 empty AttributedSubstrings from different base AttributedStrings, something crashes. Tested on mac, untested on other platforms.

SubstrCrash.swift:

import Foundation

func sub(_ s: AttributedString) -> AttributedSubstring { s[s.startIndex..<s.endIndex] }
print(sub("") == sub(""))

Result:

 $ swift --version
swift-driver version: 1.45.2 Apple Swift version 5.6 (swiftlang-5.6.0.323.62 clang-1316.0.20.8)
Target: x86_64-apple-macosx12.0

$ swift SubstrCrash.swift
Stack dump:
0.	Program arguments: /Applications/Xcode-13.3.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -interpret SubstrCrash.swift -enable-objc-interop -stack-check -sdk /Applications/Xcode-13.3.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk -color-diagnostics -new-driver-path /Applications/Xcode-13.3.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -resource-dir /Applications/Xcode-13.3.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name SubstrCrash -target-sdk-version 12.3
1.	Apple Swift version 5.6 (swiftlang-5.6.0.323.62 clang-1316.0.20.8)
2.	Compiling with the current language version
3.	While running user code "SubstrCrash.swift"
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000110b14de7 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 39
1  swift-frontend           0x0000000110b13e38 llvm::sys::RunSignalHandlers() + 248
2  swift-frontend           0x0000000110b15440 SignalHandler(int) + 288
3  libsystem_platform.dylib 0x00007ff8021b7dfd _sigtramp + 29
4  libsystem_platform.dylib 0x0000000000000001 _sigtramp + 18446603370545578529
5  libswiftFoundation.dylib 0x00007ff813bf2716 function signature specialization <Arg[2] = Dead> of static Foundation.AttributedSubstring.== infix(Foundation.AttributedSubstring, Foundation.AttributedSubstring) -> Swift.Bool + 2982
6  libswiftFoundation.dylib 0x0000000113b9d0ff function signature specialization <Arg[2] = Dead> of static Foundation.AttributedSubstring.== infix(Foundation.AttributedSubstring, Foundation.AttributedSubstring) -> Swift.Bool + 18446603374875555215
7  swift-frontend           0x000000010b927560 llvm::orc::runAsMain(int (*)(int, char**), llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, llvm::Optional<llvm::StringRef>) + 1792
8  swift-frontend           0x000000010b883dcd swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions const&, swift::SILOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >&&) + 13613
9  swift-frontend           0x000000010b84b2c3 performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 2259
10 swift-frontend           0x000000010b83e953 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 21107
11 swift-frontend           0x000000010b7fc5d4 swift::mainEntry(int, char const**) + 1108
12 dyld                     0x0000000113ba652e start + 462
[1]    87164 illegal hardware instruction  swift SubstrCrash.swift

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions