• issues
  • 在构造函数 #1273 中使用无效指针实例化 String 时崩溃

Bug 描述
以下代码崩溃:

fn main():
    _ = String(String()._as_ptr())

以及以下内容:


fn main():
    _ = String(DTypePointer[DType.int8].alloc(-1))

故障转储:

Please submit a bug report to https://github.com/modularml/mojo/issues and include the crash backtrace along with all the relevant source codes.
Stack dump:
0.      Program arguments: mojo tree.mojo
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  mojo                     0x000000010422afc0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  mojo                     0x0000000104229120 llvm::sys::RunSignalHandlers() + 112
2  mojo                     0x000000010422b65c SignalHandler(int) + 344
3  libsystem_platform.dylib 0x000000018772fa24 _sigtramp + 56
4  libsystem_platform.dylib 0x0000000280034068 _sigtramp + 4170204796
5  mojo                     0x00000001045db3e0 M::KGEN::ExecutionEngine::runProgram(llvm::StringRef, llvm::StringRef, llvm::function_ref<M::ErrorOrSuccess (void*)>) + 212
6  mojo                     0x0000000104185210 run(M::State const&) + 4052
7  mojo                     0x000000010416ee78 main + 1672
8  dyld                     0x00000001873850e0 start + 2360
[45025:1682840:20231111,154219.151946:WARNING crash_report_exception_handler.cc:257] UniversalExceptionRaise: (os/kern) failure (5)

也许它应该在施工时进行验证和拒绝。

不过,以下代码有效:

fn main():
    _ = String(String("A")._as_ptr())
    _ = String(DTypePointer[DType.int8].alloc(0))

系统信息

System Version: macOS 14.1 (23B74)
Kernel Version: Darwin 23.1.0
Model Name: MacBook Pro
Model Identifier: MacBookPro18,3
Model Number: MKGP3SM/A
Chip: Apple M1 Pro
Total Number of Cores: 8 (6 performance and 2 efficiency)
Memory: 16 GB

mojo 0.5.0 (6e50a738)
modular 0.2.1 (5144fffe)

指针最终是一个不安全的功能。 是一个私有方法,在本例中恰好返回 null 指针。 也许可以断言大小是正数,但一般来说,指针是程序员需要非常小心的功能。String()._as_ptr()alloc(-1)alloc

我同意处理指针需要非常小心,但只要我们能做到,我们都应该尽量确保程序员做正确的事情(默认情况下尽可能安全)。例如,断言会很棒。这比有安全漏洞要好。

顺便说一句,我们不必使用数据类型 Int 作为大小。我们也可以采用一个名为 (or
) 或任何其他名称的结构,其构造函数断言中包含确保它始终为正的结构。然后,此数据类型将可重用。我认为它也可以实现零成本,并且它将是类型安全的,并且对开发人员的意图有清晰的文档。Size PositveNumber

10 个月 后