【问题标题】:C++ : gcc compiler warning for large stack allocationC++:大堆栈分配的 gcc 编译器警告
【发布时间】:2021-12-26 06:17:26
【问题描述】:

考虑:

void largestackallocation() {
    double a[10000000];
}

int main() {
    return 0;
}

在使用 MSVC(Cl.exe 和 MSBuild.exe)进行编译时,会发出警告 C6262,建议将分配移动到堆而不是堆栈。编译处于发布模式,具有以下选项:

/permissive- /ifcOutput "x64\Release\" /GS /GL /W3 /Gy /Zc:wchar_t /I"E:\local\boost_1_72_0" /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc142.pdb" /Zc:inline /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /FC /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /FA /Fp"x64\Release\windows.pch" /diagnostics:column

在 gcc 上,使用发布模式构建,甚至可以将警告转换为错误:

g++    -c -O2 -Werror -MMD -MP -MF "build/Release/GNU-Linux/_ext/511e4115/largestackallocation.o.d" -o build/Release/GNU-Linux/_ext/511e4115/largestackallocation.o ../src/largestackallocation.cpp
mkdir -p dist/Release/GNU-Linux

不会发出警告/错误。使 gcc/g++ 在潜在的大堆栈分配上发出警告的选项/设置是什么?

【问题讨论】:

  • gcc 有一个-Wstack-usage=<limit> 选项。例如,如果函数堆栈使用量超过 255 个字节,-Wstack-usage=255 将发出警告。选择一个您认为适当保守的限制。完成的计算是保守的(即有时可能会高估函数的堆栈使用量),但也允许动态堆栈分配(VLA、alloc() 等)。
  • @Peter 我只是在检查,然后我也没有收到警告:godbolt.org/z/9n6j56h89

标签: c++ gcc g++ gcc-warning


【解决方案1】:

-Wlarger-than="max-bytes" 可能是您正在寻找的。每当定义大小超过“最大字节”的对象时,它都会向您发出警告。

【讨论】:

  • gcc.gnu.org/onlinedocs/gcc/Warning-Options.html 似乎暗示了-Wlarger-than=‘PTRDIFF_MAX’ is enabled by default. ,但没有发出警告。
  • 是的,在明确声明 -Wlarger-than=10000 时,确实会发出警告。如果在堆上分配了 a,此警告就会消失。
  • @Tryer 10000000*sizeof(double) 可能不大于PTRDIFF_MAX,这就是没有发出警告的原因
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2018-04-10
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多