我写了一个纯粹的Swift框架,我将其嵌入到我的项目中.
当我调试我直接从我的应用程序使用的代码时,调试工作正常.
例如,如果我Dog用一个方法在框架内编写一个类,我从我的应用程序调用它,一切都很好.
但是,如果我编写一个基类Animal,然后Dog在我的app模块中继承Animal并且断点到达实现的类Animal,它显示如下:
如果Animal是协议并且我在其中编写扩展或默认实现并且我从一个实例调用该方法,则会发生相同的情况Dog.
我已经检查过我确实在调试模式下运行框架,没有优化,没有剥离符号,也使用DWARF和dSYM.
我最近正在查看一些代码,其中clang会由于产生警告-Wtautological-pointer-compare。
可以将代码简化为:
void foo(const char*s) __attribute__((nonnull)) {
if (s) { /* Test added just in case*/
if (s[0]=='a') s[0]='b'; /* Dummy code using the pointer */
}
}
Run Code Online (Sandbox Code Playgroud)
显然,如果我们信任属性,则s不能为null,并且警告是多余的。但是,对我来说,似乎最好处理函数中的空值(因为我们不能相信调用代码是用这些警告编译的,否则人们会读警告)-同时仍检测代码中的其他空指针问题。
因此,禁用此警告(对整个功能使用编译指示)似乎不是最佳选择。
在带有SAL的Visual Studio中,似乎可以_In_ _Pre_defensive_用来处理这种情况。
在这种情况下,
_In_ _Pre_defensive_最好在信任边界上指出,尽管调用方尝试传递NULL时将收到错误,但将分析函数体,就像参数可能为NULL一样,并且尝试取消引用指针如果没有先检查它是否为NULL,就会被标记。
c可能有类似的东西吗?