【问题标题】:Seemingly incorrect conversion from int to char* - how to see an issue从 int 到 char* 的看似不正确的转换 - 如何查看问题
【发布时间】:2015-12-14 12:45:28
【问题描述】:

据我了解,这段代码 sn-p 有问题,因为在 to_stringport 的值不正确之后,std::string 将被删除。

#include <iostream>
#include <stdio.h>

int main() {
        int a = 123;
        const char* port = std::to_string(a).c_str();
        printf("val = %s", port);

        return 0;
}

但是,程序运行良好并打印“123”(使用 g++ 编译器)。 Valgrind 也没有发现问题。

有什么方法可以证明(可能是一些工具或编译器选项)上面的代码确实有问题?

【问题讨论】:

  • 工作正常(或至少看似工作正常)不幸的是UB的可能性之一。
  • 这就是为什么该转换是明确的并且具有 ugly 名称c_str()
  • 不幸的是,由于小字符串优化,免费后无法访问。如果您将代码更改为unsigned long long a = 1234567891343433ull;,您将收到来自valgrind的投诉。

标签: c++ memory type-conversion std valgrind


【解决方案1】:

不,一般来说,您无法“检测”未定义的行为。电子围栏可能有帮助。

您应该在同行评审期间发现这些问题。

通过完全避免const char*,也可以几乎消除创建它们的风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多