Tag: gcc warning

函数’strtok_r’的隐式声明尽管包括

我有以下代码来标记包含由\n分隔的行的字符串,每行包含由\t分隔的整数: void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) { char *saveptr1, *saveptr2; char *str1, *str2; char delimiter1[2] = "\n"; char delimiter2[2] = " "; char line[200]; char integer[200]; int j; for(j = 1, str1 = file_contents; ; j++, str1 = NULL) { line = strtok_r(str1, delimiter1, &saveptr1); if (line == NULL) { break; } for […]

为什么-Wcast-align没有警告在x86上从char *转换为int *?

我知道gcc有一个选项-Wcast-align,它会在指针被抛出时发出警告,以便增加目标所需的对齐。 这是我的计划: char data[10]; int ptr = *((int *)data); 在我的机器上,数据的对齐要求是1,而ptr是8。 为什么我没有收到警告? 可能是因为我正在为x86编译吗?

gcc不会警告无法访问的代码

我想知道为什么gcc(4.6.3)没有给我这个例子中无法访问的代码的警告: #include int status(void) { static int first_time = 1; if (first_time) { return 1; first_time = 0; /* never reached */ } else { return 0; } } int main(int argc, const char *argv[]) { printf(“first call %d\n”, status()); printf(“second call %d\n”, status()); return 0; } 注意,故障status()函数的目的是保持状态。 我曾期望通过-Wall得到警告。 我也试过了-Wunreachable-code , -Wextra , -pedantic和-ansi (正如这里所讨论的那样)。 […]

赋值 = :不兼容的指针

当我编译这样的东西 double da[ 3 ] = { 2., 3., 4. }; double (* pda)[ 3 ] = &da; double const (* cpda)[ 3 ] = pda; // gcc: warning; MSVC: ok gcc警告我 warning: initialization from incompatible pointer type [enabled by default] 问题:这项任务有什么问题? 是的,从技术上讲,这些是不同的类型,但我没有看到任何危险, double const (*)[ 3 ]看起来比double (*)[ 3 ]更安全。 我做了一些测试,结果让我更加困惑: 1)MSVC非常满意double const (* […]

为了将签名文字分配给无符号类型,为什么GCC不会产生警告?

本网站上的几个问题揭示了混合有符号和无符号类型时的缺陷,大多数编译器似乎都很好地生成了这种类型的警告。 但是,在为无符号类型指定有符号常量时,GCC似乎并不在意! 考虑以下程序: /* foo.c */ #include int main(void) { unsigned int x=20, y=-30; if (x > y) { printf(“%d > %d\n”, x, y); } else { printf(“%d <= %d\n", x, y); } return 0; } 使用GCC 4.2.1进行编译如下所示在控制台上没有输出: gcc -Werror -Wall -Wextra -pedantic foo.c -o foo 生成的可执行文件生成以下输出: $ ./foo 20 <= -30 当将有符号值-30分配给无符号整数变量y时,是否有某些原因导致GCC不生成任何警告或错误消息?

为什么“函数名称”在C中评估为true,以及如何在其上发出警告

我最近偶然发现了以下gcc 3.2.2编写ac程序的行为: 在if语句中,我忘记了函数的大括号,并写道: if(myFunc)…而不是if(myFunc())… 虽然我几乎每个警告都打开了,但这并没有产生错误。 它只是评估为true 。 为什么这首写法律代码? 因为函数存在/有地址? 有谁知道如何避免这样的错误,或者是否有一个我忽略的警告选项? 这个问题在以后的gcc版本中是否能更好地解决? 这里是完整性的确切编译器调用: msp430-gcc -g -Os -mmcu=msp430x1611 -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wwrite-strings -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wimplicit-function-declaration -Werror (因为我被迫使用gcc 3.2.3没有-Wextra)

GCC缺少初始化程序的大括号

我在C中有这个结构,我想初始化为零。 如何摆脱缺失的括号警告? typedef struct { uint32_t incoming[FRAME_TYPE_MAX]; uint32_t outgoing[FRAME_TYPE_MAX]; uint32_t timeouts; uint32_t crc_errors; } pkt_t; static pkt_t stats = {0};

有没有办法在命令行中获取可读的gcc错误和警告输出?

对于一些长的错误,gcc输出是密集的并且有很多换行等。特别是当错误很微妙时,我可能需要10-30秒的眯眼用眼睛来解析它。 我已经开始在一个开放的代码编辑器窗口中粘贴它,以获得一些基本的语法突出显示并启用regex的重新格式化。 有没有人发明过更自动化的方法?

从以下代码获取警告“从不同大小的整数转换为指针”

代码是: Push(size, (POINTER)(GetCar(i) == term_Null()? 0 : 1)); 这是C code push返回ABC的 typedef POINTER *ABC typedef void * POINTER ABC size; Push(ABC,POINTER); XYZ GetCar(int); typedef struct xyz *XYZ; XYZ term_Null(); long int i; 特别警告的原因是什么?

如何让gcc警告返回局部变量的地址?

使用gcc 4.4.5,我发出以下代码的警告。 char *f(void) { char c; return &c; } 但是,当我使用临时指针时,不再有警告(即使行为是错误的)。 char *f(void) { char c; char *p = &c; return p; } 我听说C中的指针分析很难,但gcc可以警告这样的代码吗?