gcc报告“;永远不会被执行”;关于线路:while(fgets(线路,最大线路,标准线路)!=NULL)
我正在寻找一个解释,为什么gcc报告“;永远不会被执行”;关于线路:while(fgets(线路,最大线路,标准线路)!=NULL),c,cygwin,warnings,gcc3,unreachable-code,C,Cygwin,Warnings,Gcc3,Unreachable Code,我正在寻找一个解释,为什么gcc会给我这个警告 我正在使用cygwin上的gcc-3和-Wunreachable code标志进行编译,gcc向我发出以下警告: main.c:223:警告:永远不会执行 这是这一行:while(fgets(line,MAX_line,stdin)!=NULL){ 此代码位于if(exp){}块中,其中exp是根据命令行参数动态设置的(由getopt()解析),请查看代码部分: if(mystruct.hastab) { 默认值为0。但如果将-t标志传递给应用
gcc
会给我这个警告
我正在使用cygwin上的gcc-3
和-Wunreachable code
标志进行编译,gcc向我发出以下警告:
main.c:223:警告:永远不会执行
这是这一行:while(fgets(line,MAX_line,stdin)!=NULL){
此代码位于if(exp){}
块中,其中exp
是根据命令行参数动态设置的(由getopt()
解析),请查看代码部分:
if(mystruct.hastab) {
默认值为0
。但如果将-t
标志传递给应用程序,则默认值将变为1
,如下所示:
struct mystruct_t {
//...
int hastab;
} mystruct;
int main(int argc, char *argv[])
{
int opt;
memset(&mystruct, 0, sizeof(mystruct));
while((opt = getopt(argc, argv, optString)) != -1) {
switch(opt) {
case 't':
mystruct.hastab = 1;
break;
//....
}
}
proc();
return 0;
}
void
proc(void)
{
char *buf, *tmpbuf, line[MAX_LINE + 1], *p, *fullfilename;
if(mystruct.hastab) {
while(fgets(line, MAX_LINE, stdin) != NULL) {
//...
}
} else {
//...
}
}
因此,执行代码是有原因的。正如所发生的那样。听起来gcc确信hastab
从未设置,或者它只是在警告代码之后才设置。看起来gcc肯定是错误的,但因为您只给了我们一些片段,所以很难确定。我认为除非我们看到com,否则任何人都无法进一步帮助您完成我们可以自己编译的程序。听起来gcc确信hastab
从来没有设置过,或者它只是在警告代码之后才设置的。看起来gcc肯定是错误的,但因为你只给了我们一些片段,所以很难确定。我认为除非我们看到一个完整的程序,否则没有人能进一步帮助你请自己填写。如果我不得不猜测的话,我会说gcc正在考虑有两种情况,您可以调用proc()
,而不必将mystruct.hastab
设置为0
以外的内容
第一种情况是,如果在第一次运行时该值变为false
,因为您将在不执行switch
语句的情况下退出循环:
while((opt=getopt(argc,argv,optString))!=-1{
第二种情况是,如果opt
从不't'
:
switch(opt) {
case 't':
mystruct.hastab = 1;
因此,您将在没有将mystruct.hastab
设置为非零值的情况下退出循环。如果我不得不猜测,我会说gcc正在考虑有两种情况,您可以调用proc()
,而不必将mystruct.hastab
设置为0
以外的内容
第一种情况是,如果在第一次运行时该值变为false
,因为您将在不执行switch
语句的情况下退出循环:
while((opt=getopt(argc,argv,optString))!=-1{
第二种情况是,如果opt
从不't'
:
switch(opt) {
case 't':
mystruct.hastab = 1;
因此,您将在没有将mystruct.hastab
设置为非零值的情况下退出循环。还有另一种可能性:问题在于宏。下面是一个简单的示例,演示了您的错误:
#include <string.h>
int s;
int main(int argc, char *argv[]) {
memset(&s, 0, sizeof(s));
}
这个错误并不是特别有启发性。但是,如果运行预处理器,请查看memset
的扩展:
$ gcc -E tmp.c
...
int s;
int main(int argc, char *argv[]) {
((__builtin_object_size (&s, 0) != (size_t) -1) ? __builtin___memset_chk (&s, 0, sizeof(s), __builtin_object_size (&s, 0)) : __inline_memset_chk (&s, 0, sizeof(s)));
}
我怀疑,由于s
的大小恒定,只有?:
的一个分支被执行过,这就是gcc所抱怨的。在您的情况下,可能是fgets
是一个宏。运行gcc-E
,在输出中找到您的问题行,看看它是否有问题(我的不是,但我不是在运行cygwin)
这个故事的寓意是:预处理器和宏很糟糕。还有一种可能性:问题在于宏。下面是一个简单的例子来说明您的错误:
#include <string.h>
int s;
int main(int argc, char *argv[]) {
memset(&s, 0, sizeof(s));
}
这个错误并不是特别有启发性。但是,如果运行预处理器,请查看memset
的扩展:
$ gcc -E tmp.c
...
int s;
int main(int argc, char *argv[]) {
((__builtin_object_size (&s, 0) != (size_t) -1) ? __builtin___memset_chk (&s, 0, sizeof(s), __builtin_object_size (&s, 0)) : __inline_memset_chk (&s, 0, sizeof(s)));
}
我怀疑,由于s
的大小恒定,只有?:
的一个分支被执行过,这就是gcc所抱怨的。在您的情况下,可能是fgets
是一个宏。运行gcc-E
,在输出中找到您的问题行,看看它是否有问题(我的不是,但我不是在运行cygwin)
这个故事的寓意是:预处理器和宏很糟糕。gcc很少是错误的。很可能代码片段没有给出完整的故事。@PaulTomblin:我在第一个while循环之前也在main函数中调用:memset(&mystruct,0,sizeof(mystruct));
if(mystruct.hastab){
在其他函数中被调用,这在main中被调用。mystruct
是一个全局变量。我之前没有发布,因为我认为这些信息没有用。这是完整的故事。@PaulTomblin:查看更新。我的main
函数是如何工作的,以及proc
函数的重要部分。我只删除了stateme块中的nts。将其放入调试器中,查看mystruct.hastab
在proc()的条目中包含的内容
。很可能这不是你所期望的。gcc很少是错的。很可能代码片段没有给出完整的故事。@PaulTomblin:我在第一次while循环之前也在main函数中调用:memset(&mystruct,0,sizeof(mystruct));
if(mystruct.hastab){
在其他函数中被调用,这在main中被调用。mystruct
是一个全局变量。我之前没有发布,因为我认为这些信息没有用。这是完整的故事。@PaulTomblin:查看更新。我的main
函数是如何工作的,以及proc
函数的重要部分。我只删除了statements在块内。将其放入调试器,查看mystruct.hastab
在proc()
的条目中包含的内容。很可能它不是您所期望的。