gcc 不警告 "variable set but not used"
gcc does not warn "variable set but not used"
我有这个 MCVE,它编译时没有任何警告:
auto foo() -> void
{
int unused = 0;
unused++;
}
对我来说,我希望 error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
。
这个 MCVE 编译也没有任何警告:
auto foo() -> void
{
int x;
int unused;
for ( ; x < 100; x++ ) unused++;
}
这里我会预料到这两个错误:
error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
.
error: ‘unused’ and ‘x’ are used uninitialized [-Werror=uninitialized]
在 for
循环上方添加 bar( unused );
会强制 gcc
显示有关使用未初始化变量的警告。
为什么 gcc 4.9.3
没有 在两个 MCVE 中的任何一个中抱怨?
编译命令:g++ -O3 -c -Wall -Wextra -Werror -std=c++11 foo.cpp
用 -O1
编译它 我收到关于 for
行的警告:error: ‘x’ may be used uninitialized in this function [-Wmaybe-uninitialized]
。所有其他优化级别不会产生任何警告。
这些变量并非未被编译器使用。仅当您声明了一个局部变量(并最终对其进行了初始化)但从不在任何语句中使用该变量时才会触发此警告。
因此,在您的示例中,变量 unused
被声明、初始化(在第一个示例中)并在第二条语句中使用(此处用于读取和写入)。变量 x
也被声明和使用(但未初始化)。
在您的第二个示例中,编译器应该对变量 x
显示 "uninitialized" 警告。如果此警告仅针对 -O1
显示,则可能是编译器错误?
这是一个 5 1/2 年前的错误。
我有这个 MCVE,它编译时没有任何警告:
auto foo() -> void
{
int unused = 0;
unused++;
}
对我来说,我希望 error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
。
这个 MCVE 编译也没有任何警告:
auto foo() -> void
{
int x;
int unused;
for ( ; x < 100; x++ ) unused++;
}
这里我会预料到这两个错误:
error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
.error: ‘unused’ and ‘x’ are used uninitialized [-Werror=uninitialized]
在 for
循环上方添加 bar( unused );
会强制 gcc
显示有关使用未初始化变量的警告。
为什么 gcc 4.9.3
没有 在两个 MCVE 中的任何一个中抱怨?
编译命令:g++ -O3 -c -Wall -Wextra -Werror -std=c++11 foo.cpp
用 -O1
编译它 我收到关于 for
行的警告:error: ‘x’ may be used uninitialized in this function [-Wmaybe-uninitialized]
。所有其他优化级别不会产生任何警告。
这些变量并非未被编译器使用。仅当您声明了一个局部变量(并最终对其进行了初始化)但从不在任何语句中使用该变量时才会触发此警告。
因此,在您的示例中,变量 unused
被声明、初始化(在第一个示例中)并在第二条语句中使用(此处用于读取和写入)。变量 x
也被声明和使用(但未初始化)。
在您的第二个示例中,编译器应该对变量 x
显示 "uninitialized" 警告。如果此警告仅针对 -O1
显示,则可能是编译器错误?
这是一个 5 1/2 年前的错误。