美文网首页
iOS小记--第三方lib包含.c文件引发的bug

iOS小记--第三方lib包含.c文件引发的bug

作者: 原鸣清 | 来源:发表于2019-02-27 11:49 被阅读2次

案情回顾

项目中因为一个功能使用了某两个功能有交集的第三方SDK,都是.a的静态库【我觉得这就是编译器没有发现问题的重点】。在实战中发现,有一个SDK总是不可用,而且和引入SDK的先后顺序有关。这种bug,简直了。

幸好(通过正常途径)搞到其中之一的源码,找了半天,把怀疑对象锁定在某个.c的文件里。配合着控制台日志,几番分析比对。最后锁定了其中的一个函数,对,就是下面这样子声明:

unsigned char* getTheDataBuffer(char *command, int *p);

从log来看,在程序该调用此函数的时候并没有执行此函数代码,log里还有两行很奇怪的输出在可见的源码里找不到,推测来自另一个静态库里,而且和调用此函数的行为有关。在函数内断点,验证猜想。最好把这个函数名改一下,解决这个bug。

猜测是那个静态库里也有同名函数,但是因为是静态库,所以编译器没有检查到重复,所以只在运行时出现意外。也有可能是其他的一些编译器特性造成的,这里面细节我不清楚,感兴趣的了解下关于C和CPP中同名函数的思考

C语言 在不同的.c 文件中可以定义相同名称的函数吗

在某度搜索了下,看到这样的一个问题,我觉得是不行的,但是原理说不上来。测试下了,编译器那一关就过不了。

// main.m
#import <Foundation/Foundation.h>
#import "test_a.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        testCXXXPrintf(10);
    }
    return 0;
}


// test_a.h
#ifndef test_a_h
#define test_a_h

#include <stdio.h>
void testCXXXPrintf(int a);

#endif /* test_a_h */


// test_a.c
#include "test_a.h"

void testPrintf(int a);

void testCXXXPrintf(int a) {
    testPrintf(a);
}

void testPrintf(int a) {
    printf("----test_a :: %d\n",a);
}


// test_b.h
#ifndef test_b_h
#define test_b_h

#include <stdio.h>

void testCXXXPrintf(int a);

#endif /* test_b_h */


// test_b.c
#include "test_b.h"
void testPrintf(int a);

void testBXXXPrintf(int a) {
    testPrintf(a);
}

void testPrintf(int a) {
    printf("----test_b :: %d\n",a);
}

build结果如图:


build 2019-02-27 11.45.48.png

这里只是记录了我怎么爬这个坑的过程,哪位兄弟要是熟悉编译原理,还望指点一二。

相关文章

网友评论

      本文标题:iOS小记--第三方lib包含.c文件引发的bug

      本文链接:https://www.haomeiwen.com/subject/sdbxuqtx.html