【问题标题】:Why patching a string using .ptr fails under Linux64 but not under Win32?为什么在 Linux64 下使用 .ptr 修补字符串会失败,但在 Win32 下不会?
【发布时间】:2013-03-25 04:05:31
【问题描述】:

为什么下面的小示例在 Linux64 下失败而在 Windows32 下失败?

module test;

import std.string, std.stdio;

void main(string[] args)
{
    string a = "abcd=1234";
    auto b = &a;
    auto Index = indexOf(*b, '=');

    if (Index != -1)
        *cast (char*) (b.ptr + Index) = '#';

    writeln(*b);
    readln;
}

【问题讨论】:

  • 如果它在一个下失败但在另一个下失败,我怀疑是 UD
  • 我猜你的意思是UB。

标签: string pointers portability d


【解决方案1】:

要记住的一点是 string(immutable char)[] 的别名,这意味着尝试写入元素是未定义的行为

我认为行为不同的一个原因是,在 linux64 下,编译器将字符串数据放在写保护内存中,这意味着 *cast (char*) (b.ptr + Index) = '#'; 失败(静默或使用 segfault)

【讨论】:

  • 这个。实际上,如果您尝试改变字符串文字,Linux 和 Windows 之间的 C/C++ 也存在相同的行为差异。改变 D 中的字符串永远不可能有正当理由,这是典型的未定义行为。
  • 我也在考虑字符串的不变性,作为对问题的解释(顺便说一句,这是运行时的段错误),Q 的目的是让专家们思考...但是您不认为“不变性”在 Win 下是相对的,而在 Linux 下是绝对的,这很矛盾吗?!它在两个系统上都应该是绝对不可变的!这也解释了我在另一个上下文中遇到的另一个问题。太棒了。
  • 这只是意味着win没有为代码提供只读内存块(通常存储字符串文字)
  • 不存在“绝对不变性”。 Immutable 只是 D 中的编译时类型注释,如果忽略编译时检查,则无法知道运行时会发生什么。 string.ptr 返回 immutable(char)* 并且编译器在编译时保证您不能修改此指针指向的数据。如果您转换为 char* ,那么运行时会发生什么是绝对未定义的。尽管一种语言可以提供额外的运行时检查,但 D 不是出于性能原因。 linux 上的 segfault 只是我们免费获得的一个 linux 特有的安全网。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多