为什么会调用此 dangling-gsl 警告?
Why is this dangling-gsl warning invoked?
我正在使用 clang-tidy 分析代码库,看到一条我不理解的警告。该警告由以下代码行调用:
void fun(const QString& bar) {
const char* c_format = bar.toStdString().c_str();
expand_some_macro(c_format);
}
c_format
在扩展宏中传递,如下所示:
#define expand_some_macro(c_format)\
char buffer[MAX_SIZE];\
va_list args;\
va_start(args, c_format);\
vsnprintf(buffer, MAX_SIZE, _TRUNCATE, c_format, args);\
va_end(args);
其中包括我目前不理解的来自 shlobj
header 的函数调用。 clang-tidy
生成以下警告:
warning: object backing the pointer will be destroyed at the end of the full-expression [clang-diagnostic-dangling-gsl]
我浏览了网络,尤其是 c++ core guidelines,试图了解这个警告,但找不到合适的参考。这让我想到了两组问题:
- 这个警告的参考是什么?我在哪里可以了解类似的警告?
- 上面的代码可能有什么问题?我需要在范围末尾调用
delete[] c_format
吗?
考虑声明...
const char* c_format = bar.toStdString().c_str();
bar.toStdString()
returns 是一个临时的 std::string
,它将在 下一个语句之前被销毁。但是您随后对该临时变量调用 std::string::c_str()
并保存其 return 值以用于...
expand_some_macro(c_format);
所以,当 c_format
在上面的表达式中使用时,它指向的内存已经在临时 std::string
被销毁时被释放。因此警告。
然而,如果不知道您的宏是做什么的(或者为什么它需要是一个宏),就很难说更多。
编辑:
澄清一下,您当前拥有的代码可以(或多或少)重写为...
const char* c_format = nullptr;
{
std::string str = bar.toStdString();
c_format = str.c_str();
}
expand_some_macro(c_format);
所以你正在使用 c_format
指向的内存超过它的生命周期。
我正在使用 clang-tidy 分析代码库,看到一条我不理解的警告。该警告由以下代码行调用:
void fun(const QString& bar) {
const char* c_format = bar.toStdString().c_str();
expand_some_macro(c_format);
}
c_format
在扩展宏中传递,如下所示:
#define expand_some_macro(c_format)\
char buffer[MAX_SIZE];\
va_list args;\
va_start(args, c_format);\
vsnprintf(buffer, MAX_SIZE, _TRUNCATE, c_format, args);\
va_end(args);
其中包括我目前不理解的来自 shlobj
header 的函数调用。 clang-tidy
生成以下警告:
warning: object backing the pointer will be destroyed at the end of the full-expression [clang-diagnostic-dangling-gsl]
我浏览了网络,尤其是 c++ core guidelines,试图了解这个警告,但找不到合适的参考。这让我想到了两组问题:
- 这个警告的参考是什么?我在哪里可以了解类似的警告?
- 上面的代码可能有什么问题?我需要在范围末尾调用
delete[] c_format
吗?
考虑声明...
const char* c_format = bar.toStdString().c_str();
bar.toStdString()
returns 是一个临时的 std::string
,它将在 下一个语句之前被销毁。但是您随后对该临时变量调用 std::string::c_str()
并保存其 return 值以用于...
expand_some_macro(c_format);
所以,当 c_format
在上面的表达式中使用时,它指向的内存已经在临时 std::string
被销毁时被释放。因此警告。
然而,如果不知道您的宏是做什么的(或者为什么它需要是一个宏),就很难说更多。
编辑:
澄清一下,您当前拥有的代码可以(或多或少)重写为...
const char* c_format = nullptr;
{
std::string str = bar.toStdString();
c_format = str.c_str();
}
expand_some_macro(c_format);
所以你正在使用 c_format
指向的内存超过它的生命周期。