关于特定编译器/平台问题的 C++ null-terminated-string

标签 c++ string

我发现了一些类似的代码(以下代码中有很多问题):

//setup consistent in each of the bad code examples
string someString; 
char* nullValue = getenv("NONEXISTENT"); // some non-existent environment variable  

// bad code example 1:
char x[1024];
sprintf(x," some text%s ", nullValue); //crashes on solaris, what about linux?  

// bad code example 2: 
someString += nullValue; // What happens here?  

//bad code example 3:
someString.append(nullValue); // What happens here?  

//bad code example 4:
string nextString=string(nullValue); //What happens here?
cout<<nextString;

我们正在使用 solaris、linux、gcc、sunstudio,将来很可能会使用 clang++。此代码的行为是否跨平台和编译器一致?在上述代码的所有情况下,我找不到描述预期行为的规范。

目前,我们在使用 gcc(和 linux)运行我们的代码时遇到问题,上述代码是否可能是原因?

如果上面的代码在所有这些环境中的行为相同,那对我来说是有值(value)的信息(即使行为是崩溃),因为我知道这不是我们的 linux 问题的原因。

最佳答案

一般来说,这些使用 NULL 的地方,其中需要一个有效的 C 字符串,会导致未定义的行为,这意味着任何事情都可能发生。 一些平台试图为此定义行为。 IIRC 有一些平台可以优雅地处理将 NULL 指针传递给 printf 系列函数以进行 %s 格式替换(打印类似“(null)”的内容)。除此之外,一些平台试图确保在这种情况下出现可重现的崩溃(例如致命信号)。但一般情况下您不能依赖它。

如果您在代码的那个区域有问题:是的,这是一个可能的原因或可能掩盖其他原因,所以:修复它,它坏了!

关于关于特定编译器/平台问题的 C++ null-terminated-string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14419174/

相关文章:

c++ - g++ 编译器和隐式转换

r - 在交替索引上拆分字符串

c++ - 如何连接两个指向字符串的指针并将其存储在数组或字符中?

c - 如何对字符串前面的数字求和

c++ - 更简单的方法来写这个 if 函数 c++

c++ - 为什么这是部分特化? (我能做什么?)

c++ - 如何迭代 std::variant 的类型?

c++ - 获取已在模板中延迟的类型

c++ - 当没有字符串匹配时,在 String 中查找函数会输出垃圾

java - 如何在java中使用正则表达式分割字符串