使用const_cast添加const时未定义的行为?

时间:2012-02-08 05:16:50

标签: c++ undefined-behavior const-correctness const-cast

此问题与我在使用const_cast制作char * const char *时所观察到的行为有关。我知道这个演员是隐式完成的,并且 t 在演员隐式完成时为我工作。

有问题的代码是:

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("ENV_VAR")); // PROBLEM !!
}

根据Linux man page getenv()获取const char *并返回char*。所以,根据我对const-correctness的理解,我可以在char*上做一个const cast而不会有任何问题。

所以,我的问题是,为什么const_cast在这里给我一个UB(代码崩溃),但正如预期没有const_cast(隐式转换)它的工作正常(所以问题必须在于使用const_cast)?

请注意,我知道隐式演员是这里的方式,通过这篇文章,我需要专门针对此处观察到的行为的答案。

编辑:

由于这些错误是由其他Soerers无法重现的,我假设这是一些奇怪的运行时/编译器问题。但是,如果标准中有任何类似问题的提及,请告诉我。

暂时我接受迈克的回答。

3 个答案:

答案 0 :(得分:3)

您正在转换函数指针,而不是函数返回的指针。首先使用(),调用该函数,然后投射结果。

编辑:我无法重现此问题。这是我使用的代码:

#include <cstdlib>
#include <iostream>

using namespace std;
int main() {
    const char * org_str = NULL;
    org_str = const_cast<const char*>(getenv("PATH"));
    cout << "Got: " << org_str << endl;
}

这是我得到的:

$ g++ foo.cc -o foo.app
$ ./foo.app
Got: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/X11R6/bin
$

顺便说一句,对NULL的赋值是不必要的;建议的做法是使用以下之一:

const char *org_str = const_cast<const char*>(getenv("PATH"));

const char *org_str(const_cast<const char*>(getenv("PATH")));

const char *org_str(getenv("PATH"));

答案 1 :(得分:2)

你不需要const_cast<>来制作const,你只需要它来取消常量。

此外,我不相信你在那里的代码是正确的,因为getenv是一个函数,看起来你正在将它用作变量。也许这样的事情会起作用:

const char * org_str = getenv("name-of-env");

答案 2 :(得分:0)

据我了解,这不是你应该施放的getenv的返回值,而是你拥有的const char。由于org_str是常量,所以如果不使用const_cast就无法分配它,这意味着您需要执行以下操作:

#include <cstdlib>
int main() {
    const char * org_str = NULL;
    const_cast<char*>(org_str) = getenv("ENV_VAR"); // NO PROBLEM !!
}

编辑:至于在getenv上使用const_cast,没有任何意义,因为你没有分配给它,因此不会有任何违反const表达式的行为,如

org_str = getenv("ENV_VAR") will give you.