诡异的GCC警告和消毒剂坠毁 [英] Weird gcc warning and sanitizer crash

查看:0
本文介绍了诡异的GCC警告和消毒剂坠毁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在项目中遇到了一些奇怪的GCC警告。让我们在3个文件中查看这个简单的示例:

struct.h

typedef struct {
    int a;
    long b;
    char *c;
} myStruct;

函数.c

#include <stdio.h>
#include <stdlib.h>
#include "struct.h"

myStruct* func() {
    myStruct* new = (myStruct*) malloc(sizeof(myStruct));
    new->a = 42;
    new->b = 84;
    new->c = "lol_ok
";
    return new;
}

void prn(myStruct* x) {
    printf("%d
", x->a);
}

main.c

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

#include "struct.h"

int main() {
    myStruct* ms = func();
    prn(ms);
    return 0;
}

因此我收到以下警告:

main.c: In function ‘main’:
main.c:8:24: warning: initialization makes pointer from integer without a cast
         myStruct* ms = func();

此外,当我使用-Wall -Wextra构建它时,我会得到更多:

main.c: In function ‘main’:
main.c:8:9: warning: implicit declaration of function ‘func’ [-Wimplicit-function-declaration]
         myStruct* ms = func();
         ^
main.c:8:24: warning: initialization makes pointer from integer without a cast
         myStruct* ms = func();
                        ^
main.c:9:2: warning: implicit declaration of function ‘prn’ [-Wimplicit-function-declaration]
  prn(ms);

这一切意味着什么?如果使用-fsanitize=undefined -fsanitize=address构建,它也会崩溃,这很奇怪。为什么?

推荐答案

缺少原型。

struct.h中包含func()的原型。

myStruct* func(void);

func()没有可见的原型时,编译器假定(在C99之前)它返回int。但是func()实际上返回一个myStruct*

请注意,此隐式int规则已从C99中删除。因此,从技术上讲,您的代码在C99和C11中是格式错误的。

提高警告级别会有所帮助。GCC提供an option捕捉:

-Wimplicit-function-declaration

这篇关于诡异的GCC警告和消毒剂坠毁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆